我的笔记,写得乱。。不过本身看得懂就好了—_—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 选项时,此选项会被忽略)重复限定符
后多加一个?
,表示匹配尽量少的字符。好比.*
要改为.*?