我正在尝试匹配文本:
1。“HeyHey HeyHey”
2。“HeyHey HeyHeyy”
正则表达式:
a /(\w+) \1\w/
b /(\w+) (\w+)\w/
c /(\w+) (?1)\w/
关注http://www.rexegg.com/regex-disambiguation.html#subroutines我认为b和c是等价的。但显然,他们不是。
有什么区别?为什么子程序不起作用,而复制相同的正则表达式有效?
在此进行实验:https://regex101.com/#pcre
答案 0 :(得分:3)
这是因为对于PCRE,默认情况下对子模式(此处为(?1)
)的引用是原子的。
(请注意,此行为特别适用于PCRE,Perl不会共享它。)
子模式是\w+
(带有贪心量词),所有单词字符都匹配(第二个字符串中的HeyHeyy
),但由于(?1)
是原子的,因此正则表达式引擎无法回溯并返回最后y
以使\w
成功。
您可以使用此模式获得相同的结果:
/(\w+) (?>\w+)\w/
# ^-----^-- atomic group
与字符串不匹配,当没有原子组时,模式成功:
/(\w+) \w+\w/
有关原子团的更多信息:http://regular-expressions.info/atomic.html
此特性也在这里描述(但仅在递归上下文中):http://www.rexegg.com/regex-recursion.html (参见"递归深度是原子")