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

问题描述 投票:1回答:1

鉴于以下PCRE正则表达式:

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

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

内联模式时如下:

^(?:a|ab)b$

字符串ababb都符合预期。

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

regex pcre
1个回答
2
投票

这是旧版PCRE的限制。我知道的唯一修复是升级到10.30版。

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

版本10.30 2017年8月14日

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

(强调我的。)

© www.soinside.com 2019 - 2024. All rights reserved.