哈希标签和单词的边界正则表达式

4

我目前有一个匹配单词的边界正则表达式

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

这正是我想要的标准字符串行为。

但是,当触发器变成#foo时,它不起作用,因为#不是单词边界的有效字符。

正则表达式由我的服务器控制,但触发器由用户控制。

只有在字符串以井号开头时才会出现此问题,所以类似foo1 #foo2的内容仍然有效。我可以始终删除开头的井号。

如何使正则表达式同时支持单词和井号?


我对70%的内容进行了相同的匹配,其中百分号打破了单词边界的匹配。 - StevenWernerCS
1个回答

1

如果不使用单词边界,你可以使用(^|\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 将无法检测到在井号符号之前的空格。

我简直不敢相信我会如此固执地关注单词边界,以至于没有想到这个方法。 - PGT
\b 可以帮助处理标点符号,所以这个例子应该为 (^|\s|[.!?,:;()[]]),但您不想捕获那个空格,因此需要剥离结果或删除标点符号。 \b 非常有用,它不能工作的这一方面让人失望。 - StevenWernerCS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接