通过使用反面的外观防止正则表达式匹配

时间:2019-05-24 17:38:25

标签: regex string regex-negation regex-lookarounds regex-greedy

我有一个正在使用的正则表达式样本,我对为什么后面的负面观察不能阻止比赛的发生感到困惑。

使用该表达式null !== value时,我希望下面的字符串不是有效的匹配项^((?<!foo)[a-z]+ ?)+$,因为在字符串bar foobar baz之后是一些字母。

即使只有foo个匹配项,我也绝对不会。我知道与foobar匹配之后的+有关。

[a-z]^((?<!foo)[a-z] ?)+$上匹配,但在fob上不匹配,这是我期望发生的情况。

我需要更改什么才能使foob字符串不匹配?

1 个答案:

答案 0 :(得分:2)

您已经知道必须从+中删除[a-z]+才能获得预期的结果。但是您可能会问为什么?请参阅以下行为。

使用[a-z]+,在后面的位置开始声明以下位置:

 bar foobar baz
 ^   ^      ^  ^

但与[a-z]不同:

 bar foobar baz
 ^^^ ^^^^^^ ^^^^
        ^

如您所见,第一种形式的(?<!foo)通过是因为所有这4个位置都没有以foo开头,但是在第二种形式中,它在第二个o之后立即停止匹配因为在foo之前有一个b