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