我有一个正在使用的正则表达式样本,我对为什么后面的负面观察不能阻止比赛的发生感到困惑。
使用该表达式null !== value
时,我希望下面的字符串不是有效的匹配项^((?<!foo)[a-z]+ ?)+$
,因为在字符串bar foobar baz
之后是一些字母。
即使只有foo
个匹配项,我也绝对不会。我知道与foobar
匹配之后的+
有关。
[a-z]
在^((?<!foo)[a-z] ?)+$
上匹配,但在fob
上不匹配,这是我期望发生的情况。
我需要更改什么才能使foob
字符串不匹配?
答案 0 :(得分:2)
您已经知道必须从+
中删除[a-z]+
才能获得预期的结果。但是您可能会问为什么?请参阅以下行为。
使用[a-z]+
,在后面的位置开始声明以下位置:
bar foobar baz
^ ^ ^ ^
但与[a-z]
不同:
bar foobar baz
^^^ ^^^^^^ ^^^^
^
如您所见,第一种形式的(?<!foo)
通过是因为所有这4个位置都没有以foo
开头,但是在第二种形式中,它在第二个o
之后立即停止匹配因为在foo
之前有一个b
。