我被要求在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?