【问题标题】:Regex for a valid hashtag有效主题标签的正则表达式
【发布时间】:2021-12-05 07:15:30
【问题描述】:

我需要正则表达式来验证主题标签。每个主题标签都应以 hashtag("#") 开头。

有效输入:

1. #hashtag_abc

2. #simpleHashtag

3. #hashtag123

无效输入:

1. #hashtag#

2. #hashtag@hashtag

我一直在尝试使用此正则表达式 /#[a-zA-z0-9]/,但它也接受无效输入。

有什么建议吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    当前接受的答案在一些地方失败:

    • 它接受没有字母的主题标签(即“#11111”、“#___”都通过)。
    • 它将排除以空格分隔的主题标签(“嘿,#friend”无法匹配“#friend”)。
    • 它不允许您在主题标签上放置最小/最大长度。
    • 如果您决定将其他符号/字符添加到您的有效输入列表中,它不会提供很大的灵活性。

    试试下面的正则表达式:

    /(^|\B)#(?![0-9_]+\b)([a-zA-Z0-9_]{1,30})(\b|\r)/g
    

    它将关闭上述边缘情况,此外:

    • 您可以将 {1,30} 更改为所需的最小值/最大值
    • 如果您想稍后再添加其他符号到 [0-9_] 和 [a-zA-Z0-9_] 块中

    这是link to the demo

    【讨论】:

    • 我猜没有人关心第一个和最后一个捕获组,所以我会使用非捕获组来更改它们:(?:^|\B)
    【解决方案2】:

    回答当前问题...

    有两个问题:

    由于您要验证整个字符串,您还需要锚点(^$)来确保完整的字符串匹配:

    /^#\w+$/
    

    请参阅regex demo

    如果您想从较长的文本中提取特定的有效主题标签...

    这是一个额外的部分,因为很多人都试图提取(而不是验证)标签,所以这里有几个解决方案给你。请注意,JavaScript(以及许多其他正则表达式库)中的 \w 等于 [a-zA-Z0-9_]

    • #\w{1,30}\b - 一个 # 字符,后跟一到三十个单词字符,后跟一个单词边界
    • \B#\w{1,30}\b - 一个 # 字符,位于字符串开头或紧跟在非单词字符之后,然后是一到三十个单词(即字母、数字或下划线)字符,然后是一到三十个单词字符,然后是一个词的边界
    • \B#(?![\d_]+\b)(\w{1,30})\b - # 位于字符串开头或紧跟在非单词字符之后,然后是一到三十个单词(即字母、数字或下划线)字符(不能只是数字/下划线),然后是一个词的边界

    最后但并非最不重要的是,这是来自https://github.com/twitter/twitter-text/tree/master/js..Twitter 主题标签正则表达式。抱歉,SO 帖子太长无法粘贴,这里是:https://gist.github.com/stribizhev/715ee1ee2dc1439ffd464d81d22f80d1

    【讨论】:

    • 您当前的表达式与 OP 的第一个有效输入不匹配,因为它包含下划线。
    • @Niitaku:是的,你是对的,那么模式应该简单得多。
    • @WiktorStribiżew 这里是另一个有效输入#hashtag123
    • @Ashok:是的,它将与/^#\w+$/ 匹配,因为# 匹配哈希符号,\w+ 匹配1+ ASCII 字母、数字或_。并且锚点需要完整的字符串匹配。见this regex demo
    【解决方案3】:

    你可以试试这个:/#[a-zA-Z0-9_]+/

    这将只包括字母、数字和下划线。

    【讨论】:

    • 这个正则表达式在########之后接受一个空格
    • @Toto 我删除了\S 之前的点(.),它不接受# 之后的空格。
    • 是的,但它总是匹配#*%$£;,,不确定它是否是一个有效的标签。
    • 如果你只想限制字符使用#\w+
    • 好的,但是,现在,它比其他答案更好吗?
    【解决方案4】:

    匹配任何主题标签的正则表达式代码。

    在这种方法中,除了主要符号 !@#$%^&*() 之外,主题标签中的任何字符都可以接受

    (?<=(\s|^))#[^\s\!\@\#\$\%\^\&\*\(\)]+(?=(\s|$))
    

    使用说明

    使用时开启“g”和“m”标志!

    它通过https://regex101.com 和 VSCode 工具针对 Java 和 JavaScript 语言进行了测试。

    this repo 上可用。

    【讨论】:

    【解决方案5】:

    Unicode 通用类别可以帮助完成这项任务:

    /^#[\p{L}\p{Nd}_]+$/gu
    

    我使用 \p{L} 和 \p{Nd} unicode 类别来匹配任何字母或十进制数字。您可以为您的正则表达式添加任何必要的类别。完整的类别列表可以在这里找到:https://unicode.org/reports/tr18/#General_Category_Property

    正则表达式现场演示: https://regexr.com/5tvmo

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 2021-06-20
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2017-12-02
      相关资源
      最近更新 更多