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