使用多个匹配项在Javascript中替换正则表达式

时间:2016-04-27 03:09:33

标签: javascript regex

给出以下字符串:

var text = 'foo bar foo bar hello world';

我尝试输出字符串:

<mark>foo</mark> <mark>bar</mark> <mark>foo</mark> <mark>bar</mark> hello world

使用正则表达式:

var pattern = /(foo)|(bar)/g;
text.replace(pattern, '<mark>$1</mark>');

但输出成了:

<mark>foo</mark> <mark>foo</mark> hello world

如何在替换参数中指定所有匹配?如果我提供多个(例如100个)匹配怎么办?我是否必须在替换中指定所有匹配项($1$100)?

2 个答案:

答案 0 :(得分:4)

问题出在/(foo)|(bar)/g;bar位于第二个被捕获的群组中。而在替代中,仅使用第一个捕获的组。

您可以使用单个捕获的组,其中包含foobar的更改。我还建议使用\b字边界将foobar作为完整字词匹配,而不是像foobar这样的其他字词的一部分。

text.replace(/\b(foo|bar)\b/g, '<mark>$1</mark>');

&#13;
&#13;
var text = 'foo bar foo bar hello world';

document.body.innerHTML = text.replace(/\b(foo|bar)\b/g, '<mark>$1</mark>');
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以改进RegEx以扩展捕获组:

enter image description here

/(foo)|(bar)/g

分为:

enter image description here

/(foo|bar)/g

结果是:

"<mark>foo</mark> <mark>bar</mark> <mark>foo</mark> <mark>bar</mark> hello world"

这可以让$1同时捕获foobar,而不仅仅是foo

但是,如果您不能这样做,您确实必须手动指定所有捕获组