Javascript hashtag和word的边界正则表达式
我目前有一个与worlds匹配的边界正则表达式Javascript hashtag和word的边界正则表达式,javascript,node.js,regex,regex-lookarounds,Javascript,Node.js,Regex,Regex Lookarounds,我目前有一个与worlds匹配的边界正则表达式 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
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
这正是我想要的标准字符串的行为
但是,当触发器变为#foo
时,这不起作用,因为#
对于单词边界无效
正则表达式由我的服务器控制,但触发器由用户控制
只有当字符串以hashtag开头时,这才是一个问题,因此类似foo1#foo2
的内容仍然有效。我总是可以在一开始就去掉标签
如何使正则表达式同时支持单词和hashtags?您可以使用(^\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
不会在散列符号前面的空格上拾取任何内容。真不敢相信我如此专注于单词边界,我没有想到会这样做。\b有助于标点符号,因此这个示例应该是(^ | \\s |[.!\?,:;()[]),并且您不想捕获该空格,因此需要删除结果或删除标点符号\b是非常有用的,这方面它不起作用是一个让唐尼打了70%,其中%打破了单词边界匹配
const trigger = '#foo1';
text = 'hello #foo1 blah';
const rx = new RegExp(`(^|\\s+)${trigger}($|\\s+)`, 'i');
console.log(rx.test(text));