我对regexp有点新,我试图理解这个正则表达式:
(?<!mix\s|mixe[rds]\s|mixing\s)with(?:out)?
在我看来,如果没有跟随以下字词,则会搜索with
或without
:
因此我试图将其重新编写为:
(?<!mix(?:e[rnds]|ing)?\s)with(?:out)?
但是我收到以下错误:
我理解lookbehind如何工作(它返回固定宽度然后尝试匹配)但是不是同一个regexp中lookbehind内部的两个正则表达式?
(我在这里找到了一些信息,但我仍然不清楚为什么在这种情况下它不起作用) What's the technical reason for "lookbehind assertion MUST be fixed length" in regex?
答案 0 :(得分:2)
在这种情况下不起作用,因为子模式包含量词?
。找到此量词时,正则表达式引擎会确定您的子模式不再具有固定长度(即为真)。
即使两个子模式是等价的(但正则表达式引擎忽略了这一点),有一个量词的事实使得模式分析失败。
另一方面,pcre接受由管道分隔的几个固定长度的子图案。
使用pcre避免此问题的经典解决方法是使用\K
功能丢弃先前从匹配结果中找到的字符:
(?<!mix)(?:e[rnds]|ing)?\s\Kwith(?:out)?