如果模式以标点符号开头或结尾,如何测试单词边界?
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 的更多详细信息。
我很难测试提供的字符串(可能以 !
开头)是否被单词边界包围。
// 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 的更多详细信息。