我希望在字符串中找到关键字匹配。我试图使用单词边界,但这可能不是该解决方案的最佳情况。关键字可以是任何单词,并且可以在前面加上非单词字符。该字符串可以是任何字符串,并且可以包含数组中所有这三个单词,但我只应匹配关键字:
['hello', '#hello', '@hello'];
这是我的代码,其中包含post中的尝试:
let userStr = 'why hello there, or should I say #hello there?';
let keyword = '#hello';
let re = new RegExp(`/(#\b${userStr})\b/`);
re.exec(keyword);
/(#?\b${userStr})\b/
,但如果该字符串的确以#
开头,则会尝试匹配##hello
。matchThis
str可以是数组中的3个示例中的任何一个,而userStr可能包含matchThis
的多个变体,但只有一个是精确的答案 0 :(得分:1)
你需要在这里说明3件事:
\b
字边界是依赖于上下文的构造,如果您的输入不仅仅是字母数字,则需要明确的字边界使用
let userStr = 'why hello there, or should I say #hello there?';
let keyword = '#hello';
let re_pattern = `(?:^|\\W)(${keyword.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')})(?!\\w)`;
let res = [], m;
// To find a single (first) match
console.log((m=new RegExp(re_pattern).exec(userStr)) ? m[1] : "");
// To find multiple matches:
let rx = new RegExp(re_pattern, "g");
while (m=rx.exec(userStr)) {
res.push(m[1]);
}
console.log(res);

模式说明
(?:^|\\W)
- 匹配字符串开头或任何非字char (${keyword.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')})
- 第1组:带有转义特殊字符的关键字值(?!\\w)
- 如果当前位置右侧有一个单词char,则表示匹配失败的否定前瞻。答案 1 :(得分:-1)
检查关键字是否已经以特殊字符开头。如果是,请不要将其包含在正则表达式中。
var re;
if ("#@".indexOf(keyword[0]) == -1) {
re = new RegExp(`[@#]?\b${keyword}\b`);
} else {
re = new RegExp(`\b${keyword}\b`);
}