我目前有一个匹配世界的边界正则表达式
const trigger = 'foo1 foo2'
const rx = new RegExp(`\\b${trigger}\\b`, 'i');
return rx.test(text);
这符合以下情况:
foo1 foo2 <-- exact match
bar foo1 foo2 <-- end of sentence
foo1 foo2 bar <-- beginning of sentence
不是
barfoo1 foo2
foo1 foo2bar
barfoo1 foo2bar
这正是我想要的标准字符串行为
然而,当 trigger
变为 #foo
时,这将不起作用,因为 #
对单词边界无效。
正则表达式由我的服务器控制,但触发器由用户控制。
这只是一个问题,如果字符串以主题标签开头,那么像 foo1 #foo2
这样的东西仍然有效。我总是可以在开头去掉一个标签。
如何使正则表达式同时支持单词和主题标签?
最佳答案
除了使用单词边界,您还可以使用 (^|\s+)
作为左边界,使用 ($|\s+)
作为右边界:
const trigger = '#foo1';
text = 'hello #foo1 blah';
const rx = new RegExp(`(^|\\s+)${trigger}($|\\s+)`, 'i');
console.log(rx.test(text));
\b#foo1\b
模式的问题在于 #
已经是一个非单词字符。所以 \b
不会在哈希符号之前的空格上拾取。
关于javascript - 主题标签和单词的边界正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54585194/