一个有效的hashtag的正则表达式

6
我需要一个正则表达式来验证一个标签。每个标签都应以井号(“#”)开头。
有效输入:
1. #hashtag_abc 2. #simpleHashtag 3. #hashtag123
无效输入:
1. #hashtag# 2. #hashtag@hashtag
我尝试过这个正则表达式 /#[a-zA-z0-9]/,但它也接受了无效的输入。
你有什么建议吗?
7个回答

15

目前被接受的答案在一些地方失败了:

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

尝试以下正则表达式:

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

它将解决上述边缘情况,此外:

  • 您可以将 {1,30} 更改为所需的最小值/最大值
  • 如有需要,您可以向 [0-9_] 和 [a-zA-Z0-9_] 块添加其他符号

这里是演示的链接:https://regex101.com/r/78GYyD/5


我猜没人关心第一个和最后一个捕获组,所以我会使用非捕获组来改变它们:(?:^|\B) - Luke
这个程序完全不处理Unicode。世界上并不只有NATO字母表...它也无法处理像#invalid#invalid #invalid@ invalid#invalid ##invalid这样的情况。 - minusf

6

回答当前问题...

有两个问题:

由于您正在验证整个字符串,因此还需要锚点(^$)以确保完全匹配字符串:

/^#\w+$/

请查看正则表达式演示

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

这是一个额外的部分,因为很多人寻求提取(而不是验证)标签,所以这里有一些解决方案供您参考。只需注意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
1
@Niitaku:是的,你说得对,这个模式应该要简单得多。 - Wiktor Stribiżew
@WiktorStribiżew 这里有一个更多有效的输入 #hashtag123 - Ashok
1
@Ashok:是的,它将与/^#\w+$/匹配,因为#匹配一个井号,\w+匹配1个或多个ASCII字母、数字或下划线。锚点要求完整字符串匹配。请参见此正则表达式演示 - Wiktor Stribiżew

1

0
你可以尝试这个正则表达式:/#[a-zA-Z0-9_]+/ 这将只包括字母、数字和下划线。

这个正则表达式接受在 ######## 后面紧跟着一个空格。 - Toto
@Toto 我删掉了\S前面的点(.),现在它不接受#后面的空格了。 - Ajay Lingayat
是的,但它总是匹配 #*%$£;,,不确定它是否是一个有效的标签。 - Toto
如果你想仅限于字符,请使用#\w+ - Ajay Lingayat
好的,但是现在,它比其他答案更好在哪里? - Toto

0
一个匹配任何哈希标签的正则表达式代码。
在这种方法中,除了主要符号!@#$%^& *()外,哈希标签中接受任何字符。
(?<=(\s|^))#[^\s\!\@\#\$\%\^\&\*\(\)]+(?=(\s|$))

使用说明

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

已通过https://regex101.com和VSCode工具测试,适用于Java和JavaScript语言。

可在this repo上获取。


请不要重复给出相同的答案,标记问题为重复。 - Toto

0

/\B(?:#|пјғ)((?![\p{N}_]+(?:$|\b|\s))(?:[\p{L}\p{M}\p{N}_]{1,60}))/ug

  • е…Ғи®ёд»»дҪ•иҜӯиЁҖеӯ—з¬ҰжҲ–еёҰж•°еӯ—жҲ–_зҡ„еӯ—з¬ҰгҖӮ
  • д»…е…Ғи®ёж•°еӯ—жҲ–еёҰ_зҡ„ж•°еӯ—гҖӮ

иҝҷжҳҜUnicodeжӯЈеҲҷиЎЁиҫҫејҸпјҢеҰӮжһңжӮЁдҪҝз”ЁPythonпјҢеҲҷеҸҜиғҪйңҖиҰҒе®үиЈ…regexгҖӮ

жөӢиҜ•й“ҫжҺҘпјҡhttps://regex101.com/r/NLHUQh/1


0

在文本中检测哈希标签的有用且经过测试的正则表达式

/(^|\s)(#[a-zA-Z\d_]+)/ig

有效匹配哈希标签的示例: #abc #ab_c #ABC #aBC


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接