JavaScript使用正则表达式(regex)替换单词遇到空白问题?



我需要使用正则表达式将HTML标记围绕文本中的某些单词,

下面是我的JavaScript示例:

在本例中,第一个"We"没有被替换。为什么?如何修改?

var str="Welcome Microsoft We are Microsoft! we wehas weo in the WE world we.";
var res = str.replace(/([s!.])(micro|microsoft|we)([s!.])/gi, "$1<em>$2</em>$3");
console.log(res);
// wrong:Welcome <em>Microsoft</em> We are <em>Microsoft</em>! <em>we</em> wehas weo in the <em>WE</em> world <em>we</em>.
// right:Welcome <em>Microsoft</em> <em>We</em> are <em>Microsoft</em>! <em>we</em> wehas weo in the <em>WE</em> world <em>we</em>.

我们"没有被替换。为什么?

因为它前面的空间已经被前面的捕获消耗了,所以正则表达式引擎可以找到的第一个单词前面的空间只在&;we&;之后。

换句话说,你的正则表达式在之后匹配一个不能在下一次匹配中重用的额外字符

如何修改?

快速修复是使空格检查提前查找(顺便说一句,没有必要在字符类中转义!.):

str.replace(/([s!.])(micro|microsoft|we)(?=[s!.])/gi, "$1<em>$2</em>");

现在这将解决实际情况,但如果你的单词是输入中的第一个或最后一个单词,它将不匹配它,因为没有前面/连续字符。

实际上使用断行是很常见的b:

str.replace(/b(micro|microsoft|we)b/gi, "<em>$1</em>");

相关内容

最新更新