2

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

\b(word1|word2|prefix1|prefix2)

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

我的解决方案是为这些奇怪的情况寻找空格或起始标记。

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

现在像 .999 这样的词仍然可以正确匹配,但它也会捕获匹配的词/前缀之前的空格。出于我的目的,我不能让它捕获空白。

积极的lookbehinds 似乎解决了这个问题,但javascript 不支持它们。有没有其他方法可以获得相同的行为来解决这个问题?

4

2 回答 2

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修饰符,以便字符串中的所有出现都发生这种情况(假设这就是你想要的)。

于 2013-08-10T01:01:10.037 回答
1

让我们先弄清楚术语。正则表达式通常会消耗它匹配的所有内容。当您执行 areplace()时,已使用的所有内容都将被覆盖。您还可以单独捕获部分匹配文本,然后使用$1,$2等将它们重新插入。

当您使用单词边界时,您不必担心这一点,因为\b它不会消耗任何东西。但是现在你正在消耗前导空格字符(如果有的话),所以你必须把它重新插入。我不知道你用什么替换匹配,所以我将在这个演示中什么都不替换它们.

result = subject.replace(/(^|\s)(word1|word2|prefix1|prefix2)/g, "$1");

请注意,\b不再需要 。事实上,你必须删除它,否则它会匹配.999in 之类的东西xyz.999,因为在and\b之间匹配。我很确定你不想要那个。z.

于 2013-08-10T02:04:01.620 回答