如果模式以标点符号开头或结尾,如何测试单词边界?

How to test for word boundries, if the pattern starts or ends with punctuation?

我很难测试提供的字符串(可能以 ! 开头)是否被单词边界包围。

// found in Mozilla's RegExp guide.
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\]/g, '\$&');
}

let msg = "a b c !test1 d e f";
let cmd = "!test1";

let re = new RegExp("\b" + escapeRegExp(cmd) + "\b");

console.log(`re: ${re.test(msg)}`);        // re: false

我假设会发生这种行为,因为标点符号本身也算作单词边界?

至少转义标点符号似乎不能解决问题。 (我测试了 escapeRegExp() 的修改版本,其中包含 !,结果相同。)

作为一种解决方法,我使用了一个在白色 space 处拆分 msg 并将元素与 cmd 进行比较的版本。我对这个解决方案不是很满意,因为当 cmd 本身包含 whitespace.

时它会崩溃

您可以使用 :

// found in Mozilla's RegExp guide.
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\]/g, '\$&');
}

let msg = "a b c !test1 d e f";
let cmd = "!test1";

let re = new RegExp("(?!\B\w)" + escapeRegExp(cmd) + "(?<!\w\B)");
// console.log(re.source);// => (?!\B\w)!test1(?<!\w\B)
console.log(`re: ${re.test(msg)}`); 
// => re: true

(?!\B\w)!test1(?<!\w\B) 正则表达式匹配 !test1

  • (?!\B\w) - 检查下一个字符是否为单词字符,如果是,则当前位置需要单词边界,否则不需要单词边界
  • (?<!\w\B) - 检查前一个字符是否为单词字符,如果是,则当前位置需要单词边界,否则不需要单词边界。

查看有关 adaptive dynamic word boundaries in my YT video 的更多详细信息。