【问题标题】:RegExp: Possible to use a negative lookahead before a match term?RegExp:可以在匹配项之前使用负前瞻吗?
【发布时间】: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 正则表达式匹配第二个 foo Iin foo foo,因为它不是后视。不知道 JS 有什么解决方案。

标签: regex negative-lookahead


【解决方案1】:

因为如果你只输入(?!foo),它将占据所有没有foo的位置:

live here.

然后它会在那些位置寻找\s*foo:

live here.

【讨论】:

  • 啊!所以(?!foo) 的意思是匹配每个不紧跟foo的位置
  • @QQwy。没错,你明白了!
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2021-04-26
  • 2021-11-09
相关资源
最近更新 更多