使用正则表达式解析句子中的主题标签

Using regex to parse hashtags from a sentence

我想从一个句子中提取主题标签。例如- 如果句子是

#test1.#test2 #test3 www.google.com/#test4 www.google.com/hello#test5

主题标签将是

#test1
#test2 
#test3 

但不是#test4 或#test5,因为它们是 URL 的一部分

我正试图为此制作正则表达式。到现在我有

/(^|\s)#(\w+)\b/g

https://regex101.com/r/WPeSdE/1

这会处理#test1 和#test3,但无法获取#test2。

请帮忙。

匹配 URLs 并匹配 并捕获 主题标签,然后只获取第 1 组内容:

/\b(?:(?:https?|ftps?):\/\/|www\.)\S+|#(\w+)\b/gi

参见regex demo

详情:

  • \b(?:(?:https?|ftps?):\/\/|www\.)\S+ - 类似 URL 的模式:
    • \b - 单词边界
    • (?:(?:https?|ftps?)://|www.)` - 以下任一项:
      • (?:https?|ftps?):\/\/ - http://,或https://(或与ftp/ftps相同)
      • www\. - 或 www.
    • \S+ - 1 个或多个除空格以外的字符
  • | - 或
  • #(\w+)\b - 一个井号,然后第 1 组捕获一个或多个单词字符(井号标签),后跟单词边界。

参见下面的 JS 演示:

var rx = /\b(?:(?:https?|ftps?):\/\/|www\.)\S+|#(\w+)\b/gi;
var str = `#test1.#test2 #test3 www.google.com/#test4 www.google.com/hello#test5`;
var m, res =[];
while ((m = rx.exec(str)) !== null) {
   if (m[1]) res.push(m[1]);
}
console.log(res);

需要一个非常复杂的正则表达式来支持我所需要的。 最后,现在我最终使用了 twitter.txt 库的 hashtag 函数。处理我遇到的所有情况。