我正在尝试匹配文本:
1.“嘿嘿嘿嘿”
2.“嘿嘿嘿嘿”
与正则表达式:
a /(\w+) \1\w/
b /(\w+) (\w+)\w/
c /(\w+) (?1)\w/
- Regex a火柴1完全,并且2完全,但最后一个“y”。
- Regex b完全匹配1 and 2.
- Regex c不匹配1 or 2.
下列的http://www.rexegg.com/regex-disambiguation.html#subroutines http://www.rexegg.com/regex-disambiguation.html#subroutines我认为 b 和 c 是等价的。但显然,事实并非如此。
有什么不同?为什么子例程不起作用,而复制相同的正则表达式却有效?
在这里进行了实验:https://regex101.com/#pcre https://regex101.com/#pcre
这是因为对于 PCRE,对子模式的引用((?1)
here)默认情况下是原子的。
(请注意,此行为是 PCRE 所特有的,Perl 不具有这种行为。)
子模式是\w+
(带有贪心量词),所有单词字符都匹配(HeyHeyy
在第二个字符串中), 但是由于(?1)
是原子的,正则表达式引擎无法回溯并返回最后一个y
使\w
成功。
您可以使用此模式获得相同的结果:
/(\w+) (?>\w+)\w/
# ^-----^-- atomic group
与字符串不匹配,当没有原子组时,模式成功:
/(\w+) \w+\w/
有关原子团的更多信息:http://regular-expressions.info/atomic.html http://regular-expressions.info/atomic.html
这里也描述了这种特殊性(但仅在递归上下文中):http://www.rexegg.com/regex-recursion.html http://www.rexegg.com/regex-recursion.html (参见“递归深度是原子的”)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)