否定的超前行为:尝试匹配一个单词并否定以下单词

时间:2019-01-23 18:46:54

标签: regex

我有一个正则表达式

^.*\bfrost.*(?!flakes|snowman).*$

我正在针对以下几行进行测试:

frosted flakes
frosty snowman
frost, jack

请参见this Regex.101演示。

我只希望第三个表达式匹配,但所有三个表达式都匹配。

REGEX Try

1 个答案:

答案 0 :(得分:0)

您应将第二个.*移至前行,例如

^.*\bfrost(?!.*(?:flakes|snowman)).*$

^.*\bfrost(?!.*flakes|.*snowman).*$

请参见regex demo

在原始正则表达式中,前行位于.*之后,只要前行返回false,则正则表达式引擎就可以回溯并仍然以另一种方式匹配字符串,{{{ 1}}或snowman。当您将flakes放到前行中时,这两个单词不必立即出现在当前位置的右侧。