Javascript Regex Word Boundary,带有可选的非单词字符

时间:2017-10-25 21:28:28

标签: javascript regex word-boundary

我希望在字符串中找到关键字匹配。我试图使用单词边界,但这可能不是该解决方案的最佳情况。关键字可以是任何单词,并且可以在前面加上非单词字符。该字符串可以是任何字符串,并且可以包含数组中所有这三个单词,但我只应匹配关键字:

['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的多个变体,但只有一个是精确的

2 个答案:

答案 0 :(得分:1)

你需要在这里说明3件事:

  • 主要观点是\b字边界是依赖于上下文的构造,如果您的输入不仅仅是字母数字,则需要明确的字边界
  • 您需要在构造函数RegExp表示法中双重转义特殊字符
  • 当您将变量传递给正则表达式时,您需要确保所有特殊字符都已正确转义。

使用



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`);
}