使用正则表达式匹配字符串列表

3

我有一个在AngularJS中可以突出字符串中任意数量单词的函数。我想将其更改为突出数组中输入的任何单词,但我不确定如何编写正则表达式。以下是当前的正则表达式:

$scope.highlight = function(haystack) {
    return $sce.trustAsHtml(haystack.replace(new RegExp(needle, "gi"), function(match) {
        return '<span class="highlightWord">' + match + '</span>';
    }));
};

当前的“needle”变量只是一个普通的字符串,比如“cats”,但我想要改变它,使其包括 ['cats','registered','dog'] 等内容。
1个回答

5
使用join()方法将数组元素用竖杠|连接起来,竖杠在正则表达式中表示或运算符。
此外,您可以使用$&来获取匹配的字符串,并在替换字符串中使用它。
$scope.highlight = function (haystack) {
    return $sce.trustAsHtml(haystack.replace(new RegExp(needle.join('|'), "gi"), '<span class="highlightWord">$&</span>'));
};

var arr = ['cat', 'dog', 'elephant'];
var str = 'Cat fears dog and dog fears elephant';

document.body.innerHTML = str.replace(new RegExp(arr.join('|'), 'gi'), '<span class="highlightWord">$&</span>');
.highlightWord {
  background: yellow;
}

为了匹配精确的单词,请使用单词边界\b
str.replace(new RegExp('\\b(' + arr.join('|') + ')\\b', 'gi'), '<span class="highlightWord">$1</span>')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接