我的筆記,寫得亂。。不過本身看得懂就好了—_—html
平常工做中能接觸到的正則,分爲兩大派別,其中類 Unix 系統中經常使用的正則,屬於 POSIX 「派」(較弱),而各編程語言標準庫中的 Re,基本都是 PCRE 「派」。(詳見 正則表達式「派別」簡述)java
可雖說各編程語言基本都屬於 PCRE 派,實現上卻仍是各有特色,一個正則想在各語言間移植,也每每須要一番修改。python
今天學 Elixir,就在正則上遇到了問題,百度一番,想一想索性就把這些差異總結一遍,防止下次又掉坑裏。(包括 Python、Java、Elixir、文本編輯器的正則,有時間把 SQL 的正則也寫寫。。)正則表達式
find all
。\A
,它在 Python 中表示字符串開頭)\A
,末尾添加 \Z
(它在 Python 中表示字符串末尾).\Axxx\z
還挺經常使用的。(?P<name>your regex)
來爲分組命名,而標準語法須要去掉字符P
. 在正則中它的分組引用方法有(?P=name)
\g<name>
\1
\2
,前倆好像都是它獨有的。只有 \1
\2
通用。$1
$2
... 來表示前面捕獲的數字分組(在正則中仍然可用 \1
\2
,可是替換字符串中必須用 $1
$2
)re.sub
re.subn
(是的,不是叫 replace,而是 substitution 的縮寫)。並且使用 \1
\2
(是的,和正則中的 backreference 同樣)來引用前面捕獲的分組。(若是命名了分組,也可以使用\g<name>
,可是帶P
的那個語法就不支持了)(?aiLmsux)
來指示開啓哪些 flags~r/your regex/s
,s
表示 dot matches all。^
匹配字符串開頭或者任意一行的開頭:$
匹配字符串的結尾(若結尾有換行,匹配到換行前面的位置),或者任意一行的結尾。^
只匹配字符串開頭,$
只匹配字符串結尾(若結尾有換行,匹配到換行前面的位置)。NOTE:可是這裏還有個坑,Elixir、Java、C# 都使用 \A
來標識字符串的開頭,用 \Z
來表示字符串結尾(若結尾有換行,匹配到換行前面的位置,和 $
同樣),用\z
小寫z 表示字符串的絕對的結尾。(不論結尾是否是換行),可 Python 恰恰用 \Z
來表示絕對結尾,而且 Python 裏不存在\z
這個定位符。
express
待續編程
.
默認是匹配除非換行外的任何字符。若是須要包括換行,須要開啓dot matchs all
選項,或者使用大小寫匹配符結合(如 [\s\S]
[\w\W]
之類)*
+
?
{m,n}
),默認都是貪婪匹配,若是須要懶惰匹配,要在後面多加個?
,變成 *?
+?
{m,n}?
、$
會匹配換行符前面的位置。(也就是說這時它匹配到的位置不是真正的結尾)若是必定要匹配到結尾,須要用 \Z
(Python 應用大寫的Z,而 Elixir C# Java 應用小寫z)
dollar_endonly
選項,該選項開啓後,$
就匹配字符串的絕對結尾。(可是在開了 m 選項時,此選項會被忽略)重複限定符
後多加一個?
,表示匹配儘量少的字符。好比.*
要改爲.*?