最好的HashTag正则表达式

问题描述 投票:11回答:9

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

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

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

#\ W +

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

.net regex twitter
9个回答
9
投票

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


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


28
投票

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

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

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

再说一遍,根据RegexBuddy的说法,这就是它的匹配:

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

编辑2014年12月: 这是一个来自zero323的略微简化的版本,应该在功能上是等效的:

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

4
投票

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

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

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


1
投票

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

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

请注意,由于性能损失,我还明确限制了前瞻和外观。


1
投票

这是我用的:

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

link of the hashtag Regex to test

CavalcanteLeo


0
投票

这是我写的它寻找单词边界,只匹配哈希文本(?<=#)\w*?(?=\W)


0
投票

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

参考:Unicode Table


-1
投票

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

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

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

\B#(\w*[A-Za-z_]+\w*)
© www.soinside.com 2019 - 2024. All rights reserved.