我正在尝试查找字符串中的所有哈希标记。这些主题标签来自像twitter这样的流,它们可以在文本中的任何位置,如:
这是#awesome事件,让我们使用 标签#fun
我正在使用.NET框架(c#),我认为这将是一个合适的正则表达式模式:
#\ W +
这是最好的正则表达式吗?
答案 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说,这就是它的匹配:
突出显示的是比赛的一部分。突出显示的较暗部分表示从捕获返回的内容。
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_]*)
请注意,由于性能受到惩罚,我还明确限制了前瞻和外观。
答案 5 :(得分:1)
答案 6 :(得分:0)
这是我写的那个查找单词边界并且仅匹配散列文本(?<=#)\w*?(?=\W)
。
答案 7 :(得分:0)
/#((\w|[\u00C0-\uFFDF])+)/g
答案 8 :(得分:-1)
我测试了一些推文,并意识到了主题标签:
所以,这就是我所拥有的:
\B#(\w*[A-Za-z_]+\w*)