RegExp:可以在匹配期限之前使用否定前瞻?

时间:2015-08-26 14:46:41

标签: regex negative-lookahead

我被要求在JavaScript中创建一个查找和替换工具。 (注意:此问题仅限于JavaScript,但适用于支持(?!dont match this)正则表达式语法的所有语言。)

基本上,有人可以输入单词列表和替换列表。 最后,用户可以输入应排除的单词组合列表。

一个例子:

输入字符串:

blue moutain
blue sea
blue grass
foo
foo foo

查找/替换术语列表(为清晰起见,此处显示在彼此旁边)

blue -> red
sea -> ocean
foo -> bar

例外情况:

blue mountain
blue sea
foo foo

我的系统能够使用这些列表构建这种类型的正则表达式:

/\s*(blue)(?!\s*(mountain|sea)\s*))/

效果很好。问题是我只能在这个词之后得到的负向前瞻。 (当然,名称'否定前瞻'可能确实是有原因选择的。)

问题出在foo foo上。该工具会看到第一个foo并意识到它后跟另一个,正则表达式/\s*(foo)(?!\s*(foo)\s*))/不允许。然而,它继续到第二个foo,后面没有任何东西。因此,它会被替换,将foo foo行更改为foo bar

所以...总结一下:

为什么this regexp (?!foo)\s*foo)匹配第二个foo?

1 个答案:

答案 0 :(得分:1)

因为如果您只键入(?!foo),则所有位置都不会跟foo

live here.

然后在这些位置,它会寻找\s*foo

live here.