Javascript Regex:如何模拟积极外观的“匹配无捕获”行为?

时间:2013-08-10 00:54:36

标签: javascript regex

我有一个相对简单的正则表达式问题 - 我需要匹配字符串中的特定单词,如果它们是整个单词或前缀。使用单词边界,它看起来像这样:

\b(word1|word2|prefix1|prefix2)

但是,我不能使用单词边界条件,因为有些单词可能以奇数字符开头,例如0.999

我的解决方案是为这些奇怪的案例寻找空白或启动令牌。

(\b|^|\s)(word1|word2|prefix1|prefix2)

现在像.999这样的单词仍然可以正确匹配,但它也会捕获匹配的单词/前缀之前的空格。就我的目的而言,我无法捕获空白。

积极的外观似乎可以解决这个问题,但javascript不支持它们。还有其他方法可以解决这个问题吗?

2 个答案:

答案 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。事实上,您必须删除它,或者它会匹配.999xyz.999之类的内容,因为\bz和{{1}之间匹配}}。我很确定你不希望这样。