鉴于以下PCRE正则表达式:
(?(DEFINE)(?'pat'a|ab))^(?P>pat)b$
我预计它会匹配字符串ab
和abb
。但是,它只匹配ab
(而不是abb
,请参阅https://regex101.com/r/F70wge/1)。似乎回溯器没有进入命名子模式。
内联模式时如下:
^(?:a|ab)b$
字符串ab
和abb
都符合预期。
是否可以更改上面的正则表达式(使用命名模式)以使两个字符串匹配而不内联模式?
这是旧版PCRE的限制。我知道的唯一修复是升级到10.30版。
http://www.pcre.org/changelog.txt:
版本10.30 2017年8月14日
- 主要的解释器pcre2_match()已被重构为一个新版本,它不使用递归函数调用(因此也就是堆栈)来记住回溯位置。这使得--disable-stack-for-recursion成为一个NOOP。新的实现允许回溯到模式中的递归组调用,使其与Perl更兼容,并且还修复了一些其他难以处理的问题,例如Bugzilla中的#1887。
(强调我的。)