我有一个相对简单的正则表达式问题 - 我需要匹配字符串中的特定单词,如果它们是整个单词或前缀。使用单词边界,它看起来像这样:
\b(word1|word2|prefix1|prefix2)
但是,我不能使用单词边界条件,因为有些单词可能以奇数字符开头,例如0.999
我的解决方案是为这些奇怪的案例寻找空白或启动令牌。
(\b|^|\s)(word1|word2|prefix1|prefix2)
现在像.999这样的单词仍然可以正确匹配,但它也会捕获匹配的单词/前缀之前的空格。就我的目的而言,我无法捕获空白。
积极的外观似乎可以解决这个问题,但javascript不支持它们。还有其他方法可以解决这个问题吗?
答案 0 :(得分:5)
您可以使用(?:)
/(?:\b|^|\s)(word1|word2|prefix1|prefix2)/
更新:
根据您想要替换它的内容(以及@ AlanMoore对\b
的好处),您可能想要使用它:
var regex = /(^|\s)(word1|word2|prefix1|prefix2)/g;
myString.replace(regex,"$1<span>$2</span>");
请注意,我将第一组更改回捕获组,因为它将成为匹配的一部分,但您希望将其保留在替换字符串中(对吗?)。还添加了g
修饰符,以便对字符串中的所有匹配项进行此操作(假设这是您想要的)。
答案 1 :(得分:1)
让我们先把术语弄清楚。正则表达式通常消耗它匹配的所有内容。当你执行replace()
时,所有消耗的东西都会被覆盖。您还可以分别捕获部分匹配的文本,然后使用$1
,$2
等将其重新插入。
当您使用单词边界时,您不必担心这一点,因为\b
不会消耗任何东西。但是现在你正在消耗领先的空白字符(如果有的话),所以你必须重新插入它。我不知道你要用什么替换匹配,所以我只是替换它们没有用于此演示
result = subject.replace(/(^|\s)(word1|word2|prefix1|prefix2)/g, "$1");
请注意,不再需要\b
。事实上,您必须删除它,或者它会匹配.999
中xyz.999
之类的内容,因为\b
与z
和{{1}之间匹配}}。我很确定你不希望这样。