pcre regexp - 奇怪的Lookbehind断言不是固定的宽度

时间:2015-05-31 12:06:02

标签: regex pcre

我对regexp有点新,我试图理解这个正则表达式:

(?<!mix\s|mixe[rds]\s|mixing\s)with(?:out)?

在我看来,如果没有跟随以下字词,则会搜索withwithout

  • 混合
  • 混合器/混合/混合
  • 混合

因此我试图将其重新编写为:

(?<!mix(?:e[rnds]|ing)?\s)with(?:out)?

但是我收到以下错误:

  • Lookbehind断言不是固定宽度

我理解lookbehind如何工作(它返回固定宽度然后尝试匹配)但是不是同一个regexp中lookbehind内部的两个正则表达式?

(我在这里找到了一些信息,但我仍然不清楚为什么在这种情况下它不起作用) What's the technical reason for "lookbehind assertion MUST be fixed length" in regex?

1 个答案:

答案 0 :(得分:2)

在这种情况下不起作用,因为子模式包含量词?。找到此量词时,正则表达式引擎会确定您的子模式不再具有固定长度(即为真)。

即使两个子模式是等价的(但正则表达式引擎忽略了这一点),有一个量词的事实使得模式分析失败。

另一方面,pcre接受由管道分隔的几个固定长度的子图案。

使用pcre避免此问题的经典解决方法是使用\K功能丢弃先前从匹配结果中找到的字符:

(?<!mix)(?:e[rnds]|ing)?\s\Kwith(?:out)?