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/
- 正则表达式 a 完全匹配 1 , 而 2 完全不过最后一个 'y'.
- 正则表达式 b 完全匹配 1和 2.
- 正则表达式 c 不匹配 1 或 2.
关注 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")
我正在尝试匹配文本:
1. "HeyHey HeyHey"
2. "HeyHey HeyHeyy"
使用正则表达式:
a /(\w+) \w/
b /(\w+) (\w+)\w/
c /(\w+) (?1)\w/
- 正则表达式 a 完全匹配 1 , 而 2 完全不过最后一个 'y'.
- 正则表达式 b 完全匹配 1和 2.
- 正则表达式 c 不匹配 1 或 2.
关注 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")