命名的子模式回溯在PCRE中不起作用

时间:2017-12-22 22:01:18

标签: regex pcre

鉴于以下PCRE正则表达式:

(?(DEFINE)(?'pat'a|ab))^(?P>pat)b$

我预计它会匹配字符串ababb。但是,它只匹配ab(而不是abb,请参阅https://regex101.com/r/F70wge/1)。似乎回溯器没有进入命名的子模式。

按如下方式内联模式时:

^(?:a|ab)b$

字符串ababb都按预期匹配。

是否可以更改上面的正则表达式(使用命名模式)以使两个字符串匹配而不内联模式?

1 个答案:

答案 0 :(得分:2)

这是旧版PCRE的限制。我知道唯一的解决方法是升级到版本10.30。

http://www.pcre.org/changelog.txt

  

版本10.30 2017年8月14日

     
      
  1. 主要解释器pcre2_match()已经重构为新版本   不使用递归函数调用(因此堆栈)   记住回溯的位置。这使得--disable-stack-for-recursion a   NOOP。 新实现允许回溯到递归组调用   模式,使其与Perl 更兼容,并修复其他一些   难以解决的问题,例如Bugzilla的#1887。
  2.   

(强调我的。)