【发布时间】:2010-12-06 12:53:32
【问题描述】:
我正在尝试查找字符串中的所有哈希标记。主题标签来自 twitter 之类的流,它们可以位于文本中的任何位置,例如:
这是一个#awesome 事件,让我们使用 标签#fun
我正在使用 .NET 框架 (c#),我认为这将是一个合适的正则表达式模式:
#\w+
这是最好的正则表达式吗?
【问题讨论】:
我正在尝试查找字符串中的所有哈希标记。主题标签来自 twitter 之类的流,它们可以位于文本中的任何位置,例如:
这是一个#awesome 事件,让我们使用 标签#fun
我正在使用 .NET 框架 (c#),我认为这将是一个合适的正则表达式模式:
#\w+
这是最好的正则表达式吗?
【问题讨论】:
如果您从 Twitter 中提取包含主题标签的状态,则不再需要自己查找它们。您现在可以指定 include_entities 参数,让 Twitter 自动调出提及、链接和主题标签。
例如,对statuses/show进行以下调用:
http://api.twitter.com/1/statuses/show/60183527282577408.json?include_entities=true
在生成的 JSON 中,注意 entities 对象。
"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。
在这里查看之前的答案并制作一些测试推文以查看 Twitter 喜欢什么之后,我想我想出了一个可靠的正则表达式,应该可以解决问题。它需要正则表达式引擎中的环视功能,因此它可能不适用于所有引擎。对于 .NET 和 PCRE,它应该仍然可以正常工作。
(?:(?根据 RegexBuddy,它执行以下操作:
再一次,根据 RegexBuddy,这是它匹配的内容:
任何突出显示的内容都是匹配的一部分。较暗的突出显示部分表示从捕获返回的内容。
2014 年 12 月编辑:
这是 zero323 的一个稍微简化的版本,在功能上应该是等效的:(?
【讨论】:
(?:(?<=\s)|^)而不是(?<=\s|^)有什么特别的原因吗?
这取决于您是要匹配其他字符串中的主题标签(“Some#Word”)还是可能不是主题标签的内容(“We're #1”)。您提供的正则表达式 #\w+ 在这两种情况下都将匹配。如果您将您的正则表达式稍微修改为\B#\w\w+,您可以消除这些情况,并且只匹配单词边界上长度大于 1 的主题标签。
【讨论】:
\b[^ .,)\]}] 会是更好的选择。但这仍然需要在开头使用单词字符(字母/数字,iirc),\b 才能工作。不过,我完全不知道如何在 Twitter 上使用“主题标签”。可能是我在这里大错特错了,除了连字符之外,它们通常包含标点符号。
\b# 仅在 # is 前面紧跟一个单词字符时才匹配。如果有的话,你想要相反的:\B#(\B == “一个不是单词边界的位置”)。
\B#\w\w+'。
我在推特上发布了一个带有随机放置的哈希标签的字符串,查看了 Twitter 用它做了什么,然后尝试用正则表达式匹配它。这是我得到的:
\B#\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
【讨论】:
据我所知,这种模式效果最好。这里发布的其他人没有考虑到以数字开头的主题标签是无效的。请确保在提取主题标签时仅使用第二个捕获组。
(^|\s)#([A-Za-z_][A-Za-z0-9_]*)
请注意,由于性能损失,我还明确限制了前瞻和后瞻。
【讨论】:
【讨论】:
这是我写的,它查找单词边界并且只匹配哈希文本(?<=#)\w*?(?=\W)。
【讨论】:
/#((\w|[\u00C0-\uFFDF])+)/g
【讨论】:
我测试了一些推文,并意识到主题标签:
所以,这就是我所拥有的:
\B#(\w*[A-Za-z_]+\w*)
【讨论】: