【发布时间】:2015-08-26 22:53:28
【问题描述】:
我被要求在 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*))/
效果很好。问题是我只能在这个词之后得到否定的前瞻工作。 (当然,选择“否定lookahead”这个名字确实是有原因的。)
问题在于foo foo。该工具看到第一个foo 并意识到它后面跟着另一个,正则表达式/\s*(foo)(?!\s*(foo)\s*))/ 不允许这样做。但是,然后它继续到第二个foo,之后没有任何内容。因此,它被替换,将foo foo 行更改为foo bar。
所以...总结一下:
为什么this regexp ((?!foo)\s*foo) 匹配第二个foo?
【问题讨论】:
-
(?!foo)\s*foo正则表达式匹配第二个fooIinfoo foo,因为它不是后视。不知道 JS 有什么解决方案。