3

我正在寻找匹配/(?=\W)(gimme)(?=\W)/gi或类似的东西。\W应该是零宽度字符来围绕我的实际匹配。

也许有些背景。我想用添加的一些文字填充替换某些单词(always \w+),但前提是它没有被 a 包围\w。(这听起来像是一个消极的环顾四周,但我听说 JS 不这样做!?)

(顺便说一句:上面的“给我”是我想替换的字面量。如果这不明显的话。)

它必须是(?)环顾四周,因为\W必须是零宽度,因为意图是 a.replace(...)并且我不能替换/复制周围的字符。

所以这行不通:

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

必须忽略零宽度字符,因此该函数只能返回(和替换 doMagic(match)

我只有非常有限的环视经验,在 JS 中没有。格拉齐。

PS。或者,也许我需要回顾一下,而 JS 不支持这些..?我很困惑?

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

4

3 回答 3

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

  • 实现您想要做的最简单的方法可能是匹配:

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

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

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

(\W+?)gimme(\W+?)- 你的比赛 - 请注意这次之前和之后的字符在捕获组 1 和 2 中

而且您想\1[yourReplacement]\2用作替换字符串-不确定如何在 JS 中使用反向引用,但想法是告诉引擎\1您的意思是与第一个捕获括号匹配的任何内容。在某些语言中,这些是使用$1.

于 2012-06-08T18:34:11.417 回答
2

您当前拥有的内容将不起作用,原因如下,(?=\W)表示“下一个字符不是单词字符”,而您尝试匹配的下一个内容是文字g,因此您有矛盾(“下一个字符是 a g,但是不是一封信”)。

实际上,您确实需要后视,但 JavaScript 不支持它们。

查看这篇关于在 JavaScript 中模仿 Lookbehind 的文章以了解可能的方法。

于 2012-06-08T18:30:26.520 回答
1

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

这个是基于 javascript 的,并带有一个漂亮的演示

于 2012-06-08T18:35:06.813 回答