Regex PCRE正则表达式反向引用工作,但子例程不工作
我正在尝试匹配文本: 1.“嘿嘿嘿嘿” 2.“嘿嘿嘿嘿” 对于正则表达式: aRegex 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
/(\w+)\1\w/
b/(\w+)(\w+)\w/
c/(\w+(-1)\w/
- 正则表达式a完全匹配1和2但最后一个“y”完全匹配
- 正则表达式b完全匹配1和2
- 正则表达式c与1或2不匹配
此处试验:这是因为在PCRE中,对子模式(
(?1)
此处)的引用在默认情况下是原子的
(请注意,这种行为是PCRE特有的,Perl不共享它。)
子模式是\w+
(使用贪婪量词),所有单词字符都匹配(heyhey
,在第二个字符串中),但是由于(?1)
是原子的,正则表达式引擎无法回溯并返回最后一个y
,以使\w
成功
使用此模式可以获得相同的结果:
/(\w+) (?>\w+)\w/
# ^-----^-- atomic group
与字符串不匹配,如果没有原子组,则模式成功:
/(\w+) \w+\w/
有关原子组的更多信息:
这里也描述了这种特殊性(但仅在递归上下文中):(请参阅“递归深度是原子的”)请您进一步解释一下“默认原子的”@CasimirOk。。。我想我现在明白了。谢谢你还可以告诉我,是否有一种方法可以“非原子化”(如果这是一个有效的短语)PCRE正则表达式?@Wraith:不幸的是,这是不可能的。