2016-12-26 54 views
1

我想从句子中提取标签。对于EG- 如果句子是使用正则表达式从句子中解析#标签

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

请帮忙。

+0

我想你想[this](https:// regex101。com/r/BpBtM2/1) –

+0

@PavneetSingh,但它可以在单词,逗号或之后的任何符号之前全部停止,即使在符号 – ghostCoder

+0

#((\ w +))之后没有空格也能正常工作,不是? –

回答

0

需要非常复杂的正则表达式来支持我需要的东西。 最后,现在我结束了使用twitter.txt库的hashtag函数。处理所有我坚持的情况。

1

匹配的网址和匹配并捕获的主题标签,只是抢第1组内容:

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

regex demo

详细

  • \b(?:(?:https?|ftps?):\/\/|www\.)\S+ - 像模式的网址:
    • \b - 单词边界
    • (:(?:???HTTPS | FTPS):// | WWW 。) - - :
      • (?:https?|ftps?):\/\/ - http://https://(或具有ftp/ftps相同)
      • www\. - 或www.
    • \S+ - 1以上字符,除空白
  • | - 或
  • #(\w+)\b - 散列符号,则第1组捕获一个或多个字符(hashtag),后跟一个字边界。

请参见下面的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);