我希望匹配/(?=\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/(链接!)
答案 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。