Regex PCRE正则表达式反向引用工作,但子例程不工作

Regex PCRE正则表达式反向引用工作,但子例程不工作,regex,pcre,Regex,Pcre,我正在尝试匹配文本: 1.“嘿嘿嘿嘿” 2.“嘿嘿嘿嘿” 对于正则表达式: a/(\w+)\1\w/ b/(\w+)(\w+)\w/ c/(\w+(-1)\w/ 正则表达式a完全匹配1和2但最后一个“y”完全匹配 正则表达式b完全匹配1和2 正则表达式c与1或2不匹配 下面我认为b和c是等价的。但显然,它们不是 有什么区别?为什么复制相同的正则表达式时子程序不工作 此处试验:这是因为在PCRE中,对子模式((?1)此处)的引用在默认情况下是原子的 (请注意,这种行为是PCRE特有的,Per

我正在尝试匹配文本:

1.“嘿嘿嘿嘿”

2.“嘿嘿嘿嘿”

对于正则表达式:

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

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

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


  • 正则表达式a完全匹配12但最后一个“y”完全匹配
  • 正则表达式b完全匹配12
  • 正则表达式c12不匹配
下面我认为b和c是等价的。但显然,它们不是

有什么区别?为什么复制相同的正则表达式时子程序不工作


此处试验:

这是因为在PCRE中,对子模式(
(?1)
此处)的引用在默认情况下是原子的

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

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

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

/(\w+) (?>\w+)\w/
     # ^-----^-- atomic group
与字符串不匹配,如果没有原子组,则模式成功:

/(\w+) \w+\w/
有关原子组的更多信息:


这里也描述了这种特殊性(但仅在递归上下文中):(请参阅“递归深度是原子的”)

请您进一步解释一下“默认原子的”@CasimirOk。。。我想我现在明白了。谢谢你还可以告诉我,是否有一种方法可以“非原子化”(如果这是一个有效的短语)PCRE正则表达式?@Wraith:不幸的是,这是不可能的。