【问题标题】:Best HashTag Regex最佳 HashTag 正则表达式
【发布时间】:2010-12-06 12:53:32
【问题描述】:

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

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

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

#\w+

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

【问题讨论】:

    标签: .net regex twitter


    【解决方案1】:

    如果您从 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 工程页面的链接已损坏。
    • 上述模式可以从thisjava文件拼凑而成。此模式的验证测试位于第 120 行附近的 this 文件中。
    • @Αλεχει - 谢谢!我用您提供的最新链接更新了答案中的链接。
    【解决方案2】:

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

    (?:(?
    
    

    根据 RegexBuddy,它执行以下操作:

    再一次,根据 RegexBuddy,这是它匹配的内容:

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

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

    (?
        

    【讨论】:

    • 对于给定的问题,这是一个更好的解决方案。
    • 使用(?:(?<=\s)|^)而不是(?<=\s|^)有什么特别的原因吗?
    • @zero323 我不记得了,不。我在学习正则表达式时写了这个,所以当我不需要的时候我可能过于冗长了。
    • 感谢@KevinMark 的回复。
    • @zero323 我的荣幸。
    【解决方案3】:

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

    【讨论】:

    • 谢谢你,我有点担心边缘情况会给我带来一些悲伤。
    • 另外注意,这个正则表达式不会匹配“#tags-with-hyphens”,所以请记住...
    • 也许\b[^ .,)\]}] 会是更好的选择。但这仍然需要在开头使用单词字符(字母/数字,iirc),\b 才能工作。不过,我完全不知道如何在 Twitter 上使用“主题标签”。可能是我在这里大错特错了,除了连字符之外,它们通常包含标点符号。
    • \b# 仅在 # is 前面紧跟一个单词字符时才匹配。如果有的话,你想要相反的:\B#\B == “一个不是单词边界的位置”)。
    • 关注@Alan Moore。此处标记为正确的答案实际上并不正确,应该是\B#\w\w+'
    【解决方案4】:

    我在推特上发布了一个带有随机放置的哈希标签的字符串,查看了 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

    【讨论】:

    • 您的案例不支持#onetag#secondtag。这不应该是一个标签。
    【解决方案5】:

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

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

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

    【讨论】:

    • 我赞成这一点,因为它不需要后视并且在模式匹配上非常直截了当。
    • 这不会捕获扩展字符,例如 ñ 和 ō。
    【解决方案6】:

    这是我用的:

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

    link of the hashtag Regex to test

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

        参考:Unicode Table

        【讨论】:

          【解决方案9】:

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

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

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

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

          【讨论】:

          • 这将匹配 Twitter 不认为是主题标签的“foobar”。
          • 并且不匹配某些语言,例如#déjà
          猜你喜欢
          • 2015-10-30
          • 2013-12-07
          • 1970-01-01
          • 1970-01-01
          • 2016-11-25
          • 1970-01-01
          • 2011-05-11
          • 2021-12-11
          • 2017-01-22
          相关资源
          最近更新 更多