示例
标志位
可用 $1 $<名称> $&(整个匹配)$`(匹配前的文本)$'(匹配后的文本)$$(一个 $)。没开 g 标志时只替换第一个。
常用正则库(点一下载入,带正反例和局限说明)
JS 正则和 PCRE / Python 的差异
- 引擎:这里跑的是浏览器的 JavaScript(ECMAScript)正则。PCRE(PHP、grep -P、Nginx)和 Python 的
re在细节上不同,同一条正则放过去可能报错,也可能悄悄变成别的意思。 - 命名组:JS 写
(?<name>…)、引用\k<name>;Python 写(?P<name>…)、(?P=name);PCRE 两种都认。 - 文本首尾:JS 没有
\A\Z\z(写了只是字母),用^$。JS 的$只匹配文本最末尾,Python 和 PCRE 的$还会匹配末尾换行符之前。 - 内联标志与注释:不支持
(?i)、(?x)自由空格模式、(?#注释)。标志只能写在外面(g i m s u y)。较新的浏览器支持局部写法(?i:…)。 - 高级功能:没有原子组
(?>…)、占有量词a++、递归(?R)、条件(?(1)…)、\G\K\R\h、POSIX 类[[:alpha:]]。 - 后行断言:JS 的
(?<=…)可以是不定长的,Python 要求定长。老版本 Safari(16.4 以前)不支持后行断言。 - \d \w \b 只认 ASCII:JS 里
\d只匹配 0–9,\w只匹配 [A-Za-z0-9_],汉字不是单词字符。Python 3 的\d\w默认认 Unicode。 - Unicode 属性:要开 u 标志,并写成
\p{Script=Han};PCRE 可以直接写\p{Han}。不开 u 时 emoji 等大于 U+FFFF 的字符按两个字符处理,.只匹配半个。 - 点号:
.默认不匹配\n\r\u2028\u2029,开 s 标志才匹配(对应 Python 的 DOTALL、PCRE 的 s)。 - 替换语法:JS 用
$1$<name>;Python 用\1\g<name>;写在代码字符串里时还要把反斜杠写两遍。 - g 与 lastIndex:带 g(或 y)的正则对象调用
test()/exec()会记住上次位置,重复调用结果可能一真一假。需要判断是否匹配时,不要复用同一个带 g 的对象。 - 位置的单位:这里显示的位置是 JS 的下标(UTF-16 码元),Python 是码点,字节串则是字节,三者遇到汉字以外的字符(emoji、生僻字)会差一位或两位。
- 回溯:JS、Python、PCRE 都是回溯引擎,写不好会指数级变慢(灾难性回溯);RE2、Go、Rust 的引擎是线性时间,但不支持反向引用和环视。