>我目前有一个与世界匹配的边界正则表达式
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#foo1b
的问题在于#
已经是一个非单词字符。 因此,b
不会拾取哈希符号前面的空格。