我想在字符串中匹配的单词周围加上粗体标签。但是,我还需要能够在网址中找到匹配的单词。如果可能的话,我希望一切都有一个RegEx。
这是我到目前为止所尝试的内容:
我试过new RegExp("(^|\\s)(" + match.join('|') + ")(\\s|$)","ig")
和new RegExp('(\\b)(' + match2.join('|') + ')(\\b)','ig')
//keyword
var keyword = "Donec sed odio bacon dui.";
var match = ["donec", "bacon", "dui"]; //why does it ignore dui???
var reg1 = new RegExp("(^|\\s)(" + match.join('|') + ")(\\s|$)","ig");
//var reg1 = new RegExp('(\\b)(' + match.join('|') + ')(\\b)','ig');
var reg2 = "$1<b>$2</b>$3";
var keyword = keyword.replace(reg1, reg2);
console.log(keyword);
请帮助
答案 0 :(得分:2)
问题在于重叠匹配。单词dui
在它之后有一个句号(它不是空格,也不是字符串的结尾)。在第一个正则表达式的末尾使用单词边界:
var reg1 = new RegExp("(^|\\W)(" + match.join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var reg2 = "$1<b>$2</b>";
请注意,代替\\b
,您可以使用(?!\\w)
否定前瞻而不是(^|\\s)
,您可以使用(^|\\W)
来确保您不依赖于空白关键字。如果关键字恰好位于已标记的文本中,(?!\\w|(?:[^<]*</[^>]+)?>)
前瞻将使匹配失败。
第二个正则表达式需要单词边界,因为单词在连字符之间:
var reg3 = new RegExp("\\b(" + match2.join('|') + ")\\b(?!(?:[^<]*</[^>]+)?>)","ig");
var reg4 = "<b>$1</b>";
或更多才多艺:
var reg3 = new RegExp("(^|\\W)(" + match2.join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var reg4 = "$1<b>$2</b>";
此外,您需要使用关键字转义特殊的正则表达式元字符,以便将它们视为文字符号。请参阅match.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'))
。
参见demo(两个regexp的替换模式相同,声明一次):
//keyword
var keyword = "Donec <b>sed</b> odio bacon dui.";
var match = ["test.", "donec", "bacon", "dui"];
var reg = new RegExp("(^|\\W)(" + match.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var repl = "$1<b>$2</b>";
var keyword = keyword.replace(reg, repl);
console.log(keyword);
//website
var keyword2 = "http://www.website.co.uk/hey-<b>more hello o</b>-hey-hi"; //doesnt work
var match2 = ["hello", "hey", "b"];
var reg2 = new RegExp("(^|\\W)(" + match2.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var keyword2 = keyword2.replace(reg2, repl);
console.log(keyword2);
&#13;
答案 1 :(得分:2)
不需要这个复杂的正则表达式来为已知单词添加粗体。 像这样使用替换:
1)对于全局 substr 匹配(多个替换,对于部分单词),使用:
var res = str.replace(/blog/g, "<b>blog</b>");
2)对于全局单词匹配(多次替换,仅限整个单词),请使用:
var res = str.replace(/\bblog\b/g, "<b>blog</b>");
使用\ b作为单词边界。注意“ - ”char被称为单词边界。 更容易抽象出任何单词,更容易阅读代码