Javascript中的特定正则表达式正面看起来(前后)

时间:2012-06-08 18:20:04

标签: javascript regex replace lookaround

我希望匹配/(?=\W)(gimme)(?=\W)/gi或类似。 \W应该是零宽度字符以包围我的实际匹配。

也许有些背景。我希望te替换某些单词(总是\w+)并添加一些文字填充,但前提是它没有被\w包围。 (这听起来像是负面的看法,但我听说JS不会这样做!?)

(顺便说一下:上面的“gimme”是我要替换的字面文字。如果那不明显的话。)

必须是(?)一个环视,因为\W必须是零宽度,因为意图是.replace(...)而我不能替换/复制周围的人物。

所以这不起作用:

text.replace(/(?=\W)(gimme)(?=\W)/gi, function(l, match, r) {
  return l + doMagic(match) + r;
})

必须忽略零宽度字符,因此该函数可以返回(并替换) doMagic(match)

我只有非常有限的外观体验,而不是JS中的。古拉爵。

PS。或者我可能需要一个lookbehind,那些在JS中不受支持..?我很困惑?

PS。一点上下文:http://jsfiddle.net/rudiedirkx/kMs2N/show/(链接!)

3 个答案:

答案 0 :(得分:3)

  • 您可以使用字边界快捷方式\b来断言它是您匹配的整个字词。

  • 实现目标的最简单方法可能是匹配:

/(\s+gimme)(?=\W)/gi

并替换为[yourReplacement] - 即在' gimme'之前捕获空格。然后在替换中加入一个。

  • 解决此问题的另一种方法是在gimme字面值之前和之后捕获更多字符,然后使用具有反向引用的组:

(\W+?)gimme(\W+?) - 您的匹配 - 请注意,此时前后字符位于捕获组1和2中

并且您想要使用\1[yourReplacement]\2作为替换字符串 - 不确定如何在JS中使用反向引用,但想法是告诉引擎\1你的意思是匹配的是什么通过第一个捕获括号。在某些语言中,可以使用$1访问这些语言。

答案 1 :(得分:2)

您目前拥有的内容无效,出于以下原因,(?=\W)表示“下一个字符不是单词字符”,您尝试匹配的下一个字符是文字​​g,所以你有一个矛盾(“下一个字符是g,但不是字母”。

你确实需要一个lookbehind,但JavaScript不支持它们。

查看Mimicking Lookbehind in JavaScript上的这篇文章,了解可能的方法。

答案 2 :(得分:1)

您是否考虑过使用词法分析器/解析器组合?

This one基于javascript,并附带一个漂亮的demonstration