【问题标题】:Using regex to parse hashtags from a sentence使用正则表达式从句子中解析主题标签
【发布时间】:2016-12-26 13:10:43
【问题描述】:

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

#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。

请帮忙。

【问题讨论】:

  • 我猜你想要this
  • @PavneetSingh 但它可以是单词之前的句号、逗号或任何可以出现单词的符号,即使符号后面没有空格
  • #(\w+) 工作正常,不?
  • 很难区分 #test5 是 url 的一部分,而 #test2 不是。您要么需要一个 really really 复杂的正则表达式,要么您编写更多代码来首先将文本标记为普通文本和 url,然后在普通文本中找到主题标签,特别是如果您需要提取/替换/突出显示网址和主题标签。

标签: javascript regex hashtag


【解决方案1】:

匹配 URL 并匹配 并捕获主题标签,然后抓取第 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2013-12-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多