RegExp:是否可以在匹配项之前使用负前瞻?

RegExp:是否可以在匹配项之前使用负前瞻?,regex,negative-lookahead,Regex,Negative Lookahead,我被要求用JavaScript创建一个查找和替换工具。(注意:此问题不限于JavaScript,但适用于所有支持(?!不匹配此)正则表达式语法的语言。) 基本上,有人可以输入单词列表和替换列表。 最后,用户可以输入应排除的单词组合列表 例如: 输入字符串: blue moutain blue sea blue grass foo foo foo 查找/替换术语列表(为清晰起见,此处相邻显示) 例外情况清单: blue mountain blue sea foo foo 我的系统能够使用这些列

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

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

例如:

输入字符串:

blue moutain
blue sea
blue grass
foo
foo foo
查找/替换术语列表(为清晰起见,此处相邻显示)

例外情况清单:

blue mountain
blue sea
foo foo
我的系统能够使用这些列表构造以下类型的正则表达式:

/\s*(blue)(?!\s*(mountain|sea)\s*))/
这很有效。问题是,我只能在单词之后使用消极的前瞻。(当然,选择“负向前瞻”这个名称可能确实有原因。)

例如,问题在于
foo-foo
。该工具看到了第一个
foo
,并意识到它后面紧跟着另一个,这是regexp
/\s*(foo)(?!\s*(foo)\s*)/
不允许的。但是,接下来是第二个
foo
,后面没有任何内容。因此,它被替换,将
foo-foo
行更改为
foo-bar

所以。。。总而言之:


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

原因是如果您只键入
(?!foo)
,它将占据所有未后跟
foo
的位置:

然后在这些位置,它将查找
\s*foo


由于它不是lookback,所以
(?!foo)\s*foo
正则表达式与第二个
foo
Iin
foo
匹配。不知道JS的解决方案是什么。啊!所以,
(?!foo)
意味着匹配每个位置,而不是紧接着foo?@Qqwy。没错,你明白了!
/\s*(blue)(?!\s*(mountain|sea)\s*))/