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

PCRE regex backreference works, but subroutines do not

我正在尝试匹配文本:

1. "HeyHey HeyHey"

2. "HeyHey HeyHeyy"

使用正则表达式:

a /(\w+) \w/

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

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


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

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

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

这是因为对于 PCRE,对子模式的引用 (?1) 这里) 默认是原子的。

(请注意,此行为是 PCRE 特有的,Perl 不共享。)

子模式是\w+(带贪心量词),所有单词字符匹配HeyHeyy第二个string),但由于 (?1) 是原子的,正则表达式引擎无法回溯并返回最后一个 y 以使 \w 成功。

您可以使用此模式获得相同的结果:

/(\w+) (?>\w+)\w/
     # ^-----^-- atomic group

不匹配字符串,当没有原子组时,模式成功:

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

关于原子团的更多信息:http://regular-expressions.info/atomic.html

此处也描述了这种特殊性(但仅在递归上下文中):http://www.rexegg.com/regex-recursion.html (参见 "Recursion Depths are Atomic")