RegExp:是否可以在匹配项之前使用负前瞻?
我被要求用JavaScript创建一个查找和替换工具。(注意:此问题不限于JavaScript,但适用于所有支持RegExp:是否可以在匹配项之前使用负前瞻?,regex,negative-lookahead,Regex,Negative Lookahead,我被要求用JavaScript创建一个查找和替换工具。(注意:此问题不限于JavaScript,但适用于所有支持(?!不匹配此)正则表达式语法的语言。) 基本上,有人可以输入单词列表和替换列表。 最后,用户可以输入应排除的单词组合列表 例如: 输入字符串: blue moutain blue sea blue grass foo foo foo 查找/替换术语列表(为清晰起见,此处相邻显示) 例外情况清单: blue mountain blue sea foo foo 我的系统能够使用这些列
(?!不匹配此)
正则表达式语法的语言。)
基本上,有人可以输入单词列表和替换列表。
最后,用户可以输入应排除的单词组合列表
例如:
输入字符串:
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
Iinfoo
匹配。不知道JS的解决方案是什么。啊!所以,(?!foo)
意味着匹配每个位置,而不是紧接着foo?@Qqwy。没错,你明白了!
/\s*(blue)(?!\s*(mountain|sea)\s*))/