Javascript Regex:如何模拟“;匹配而不捕获”;积极观察的行为

Javascript Regex: how to simulate "match without capture" behavior of positive lookbehind?

本文关键字:观察 何模拟 Regex Javascript 模拟      更新时间:2023-09-26

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

'b(word1|word2|prefix1|prefix2)

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

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

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

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

正面的lookbehinds似乎可以解决这个问题,但javascript不支持它们。有没有其他方法可以让我采取同样的行为来解决这个问题?

您可以使用(?:):使用非捕获组

/(?:'b|^|'s)(word1|word2|prefix1|prefix2)/

更新:

根据你想用什么来代替它(以及@AlanMoore关于'b的好观点),你可能想用这个:

var regex = /(^|'s)(word1|word2|prefix1|prefix2)/g;
myString.replace(regex,"$1<span>$2</span>");

请注意,我将第一组改回了捕获组,因为它将是匹配的一部分,但您希望将其保留在替换字符串中(对吗?)。还添加了g修饰符,这样字符串中的所有出现都会发生这种情况(假设这是您想要的)。

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

当你使用单词boundary时,你不必担心这一点,因为'b不会消耗任何东西。但现在,如果有前导空格字符的话,你就要使用它,所以你必须把它插回原处。我不知道你要用什么来替换匹配项,所以在这个演示中,我将不使用任何内容来替换它们。

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

请注意,不再需要'b。事实上,必须删除它,否则它将匹配xyz.999中的.999,因为'bz.之间匹配。我敢肯定你不想那样。