最好的HashTag正则表达式

时间:2009-10-14 01:40:51

标签: .net regex twitter

我正在尝试查找字符串中的所有哈希标记。这些主题标签来自像twitter这样的流,它们可以在文本中的任何位置,如:

  

这是#awesome事件,让我们使用   标签#fun

我正在使用.NET框架(c#),我认为这将是一个合适的正则表达式模式:

#\ W +

这是最好的正则表达式吗?

9 个答案:

答案 0 :(得分:39)

如果您从Twitter中提取包含主题标签的状态,则不再需要自己查找。您现在可以指定 include_entities 参数,让Twitter自动调出提及,链接和主题标签。

例如,请拨打以下电话statuses/show

http://api.twitter.com/1/statuses/show/60183527282577408.json?include_entities=true

在生成的JSON中,请注意实体对象。

"entities":{"urls":[{"expanded_url":null,"indices":[68,88],"url":"http:\/\/bit.ly\/gWZmaJ"}],"user_mentions":[],"hashtags":[{"text":"wordpress","indices":[89,99]}]}

您可以使用上面的内容来定位推文中的特定实体(出现在 indices 属性表示的字符串位置之间)并对其进行适当的转换。

如果您只需要正则表达式来查找主题标签,Twitter会在open source library中提供这些标签。

标签匹配模式

(^|[^&\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7])(#|\uFF03)(?!\uFE0F|\u20E3)([\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*[\p{L}\p{M}][\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*)

上述模式可以从this java文件拼凑而成(检索2015-11-23)。此模式的验证测试位于第128行的this file附近。

答案 1 :(得分:28)

在查看之前的答案并制作一些测试推文以了解Twitter喜欢的内容后,我想我已经想出了一个可靠的正则表达式。它需要正则表达式引擎中的环视功能,因此它可能不适用于所有引擎。它应该仍适用于.NET和PCRE。

(?:(?<=\s)|^)#(\w*[A-Za-z_]+\w*)

根据RegexBuddy的说法,这可以做到以下几点: RegexBuddy Create View

再一次,据RegexBuddy说,这就是它的匹配: RegexBuddy Test View

突出显示的是比赛的一部分。突出显示的较暗部分表示从捕获返回的内容。

2014年12月编辑:
这是零点的简化版本,应该在功能上等同于:

(?<=\s|^)#(\w*[A-Za-z_]+\w*)

答案 2 :(得分:9)

这取决于你是否想在其他字符串中匹配主题标签(“Some#Word”)或可能不是主题标签的内容(“我们是#1”)。您提供的正则表达式#\w+将在这两种情况下匹配。如果您将正则表达式稍微修改为\B#\w\w+,则可以消除这些情况,并且只匹配字边界上长度大于1的主题标签。

答案 3 :(得分:4)

我发了一个随机放置哈希标签的字符串,看了Twitter用它做了什么,然后尝试将它与正则表达式匹配。这就是我得到的:

\ B#\ W * [A-ZA-Z] + \ W *

#face #Fa !ce #iam #1#1#919 < strong> #jifdosaj somethin#idfsjoa 9#9#98 9#9f9j#9jlasdjl #jklfdsajl34 #34239 #jkf #a *#1j3rj3

答案 4 :(得分:1)

据我所知,这种模式效果最佳。发布在此处的其他人不会考虑以数字开头的主题标签无效。请确保在提取主题标签时仅使用第二个捕获组。

(^|\s)#([A-Za-z_][A-Za-z0-9_]*)

请注意,由于性能受到惩罚,我还明确限制了前瞻和外观。

enter image description here

答案 5 :(得分:1)

这就是我使用的:

/#(\w*[0-9a-zA-Z]+\w*[0-9a-zA-Z])/g

link of the hashtag Regex to test

CavalcanteLeo

答案 6 :(得分:0)

这是我写的那个查找单词边界并且仅匹配散列文本(?<=#)\w*?(?=\W)

答案 7 :(得分:0)

/#((\w|[\u00C0-\uFFDF])+)/g

参考:Unicode Table

答案 8 :(得分:-1)

我测试了一些推文,并意识到了主题标签:

  • 由字母数字字符和下划线组成。
  • 必须至少有一个字母或下划线。
  • 可能有点字符,但主题标签将被解释为指向外部网站的链接。 (我不考虑这个)

所以,这就是我所拥有的:

\B#(\w*[A-Za-z_]+\w*)