正则表达式匹配带空格的短语

RegEx to match phrases with spaces

我在字符串中有一组关键字:

var keywords = ["Hello World", "or"];

我有一行文字,例如:

var text = "Hello World, Hello World";

我正在使用 RegEx 在文本中查找要突出显示的关键字,这样我得到的 html 将是:

<span class="highlight">Hello World</span>, <span class="highlight">Hello World</span>

但是,我的 RegEx 结果返回给我:

[
 0: "or"                          ----------> shouldn't it be "Hello World"?
 index: 7
 input: "Hello World, Hello World"
]

这是我的代码:

function searchFn(text, keywords) {
  regex = new RegExp(keywords.join("|");
  return regex.exec(text);
}

var text = "Hello World, Hello World";
var keywords = ["Hello World", "or"];

searchFn(text, keywords);

我的正则表达式错了吗?

您需要将关键字按长度降序排列,使用明确的词边界,全局修饰符匹配所有出现并在String#replace方法中使用它这个:

function searchFn(text, rx) {
  return text.replace(rx, '<span class="highlight"></span>');
}

var text = "Hello World, Hello World,Hello (World)!";
var keywords = ["Hello World", "or", "Hello (World)"];
var regex = new RegExp(
 "(^|\W)(" + 
 keywords
  .map(function(z) { return z.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&'); })
 .sort(function(a, b) { return b.length - a.length; })
 .join("|") +
")(?!\w)", "g");
console.log(searchFn(text, regex));

正则表达式看起来像 (^|\W)(Hello World|or)(?!\w),并且会匹配 Hello Worldor 单词作为整个单词。由于你有特殊字符,需要在关键字中escape special characters,并使用明确的词边界(^|\W)(?!\w),需要具体替换模式,即 <span...></span>,因为如果匹配,我们不想截断捕获到组 1 中的非单词字符。如果您同时拥有 Hello WorldHello / world 并且您想首先处理较长的关键字,则需要进行排序。