PCRE正则表达式反向引用有效,但子程序却没有

时间:2015-07-06 12:42:07

标签: regex pcre

我正在尝试匹配文本:

1。“HeyHey HeyHey”

2。“HeyHey HeyHeyy”

正则表达式:

a /(\w+) \1\w/

b /(\w+) (\w+)\w/

c /(\w+) (?1)\w/

  • 正则表达式 a 完全匹配 1 2 < / strong>完全但最后'y'。
  • 正则表达式 b 完全匹配 1 2
  • 正则表达式 c 1 2 不匹配< /强>

关注http://www.rexegg.com/regex-disambiguation.html#subroutines我认为b和c是等价的。但显然,他们不是。

有什么区别?为什么子程序不起作用,而复制相同的正则表达式有效?

在此进行实验:https://regex101.com/#pcre

1 个答案:

答案 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 (参见&#34;递归深度是原子&#34;)