【问题标题】:boundary regex for hashtag and word主题标签和单词的边界正则表达式
【发布时间】:2019-07-02 06:28:17
【问题描述】:

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

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 之类的内容仍然有效。我总是可以在开头去掉一个标签。

如何使正则表达式同时支持单词和主题标签?

【问题讨论】:

  • 我达到了 70%,其中 % 打破了单词边界匹配

标签: javascript node.js regex regex-lookarounds


【解决方案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 不会在井号前面的空格上找到。

【讨论】:

  • 不敢相信我如此专注于单词边界,以至于没想到这样做。
  • \b 有助于标点符号,所以这个例子应该是 (^|\\s|[.!\?,:;()[]]) 并且你不想占用那个空间所以你需要去掉结果,或者删除标点符号。 \b 非常有帮助,这方面的不工作令人失望
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2011-04-14
  • 2011-03-28
  • 2012-09-24
相关资源
最近更新 更多