【问题标题】:Regex match checksum with or without dashes带或不带破折号的正则表达式匹配校验和
【发布时间】:2020-08-18 20:25:58
【问题描述】:

要匹配无破折号校验和,我可以执行以下操作:

\b[0-9a-z]{32}\b

但是,我看到一些校验和也有破折号,例如:

d3bd55bf-062f-473b-9417-935f62c4c98a

虽然这可能是一个固定大小,先是 8,然后是 4,然后是 4,然后是 4,然后是 12,但我想知道我是否可以做一个正则表达式,其中非破折号数字的数量 加起来 32. 我认为答案是否定的,但希望某个正则表达式向导可以提出一些建议。

这里是一些示例输入的起点:https://regex101.com/r/K0IMKe/1

【问题讨论】:

  • 试试\b(?:[0-9a-z]-?){32}\b。或者,\b[0-9a-z](?:-?[0-9a-z]){31}\b,如果最后不能有-
  • @WiktorStribiżew 谢谢,你能解释一下答案是如何工作的吗?
  • 或者如果可以有 0 - 4 个破折号,您可以断言 32 - 36 个字符 ^(?=[a-z0-9-]{32,36}$)[a-z0-9]+(?:-[a-z0-9]+)*$ regex101.com/r/JM3EP6/1

标签: regex pcre


【解决方案1】:

你可以使用

\b[0-9a-z](?:-?[0-9a-z]){31}\b

请参阅regex demo

匹配

  • \b - 单词边界
  • [0-9a-z] - 数字或小写 ASCII 字母
  • (?:-?[0-9a-z]){31} - 可选的 - 重复 31 次,后跟单个数字或小写 ASCII 字母
  • \b - 单词边界。

如果你不介意后面有一个-,如果它后面有一个字符,在匹配结束时,你也可以使用

\b(?:[0-9a-z]-?){32}\b

this regex demo。在这里,(?:[0-9a-z]-?){32} 将匹配 32 个重复的数字或小写 ASCII 字母,后跟可选的连字符。

【讨论】:

  • 太好了,非常感谢您的清晰解释。出于好奇,除了“练习”之外,您建议如何提高我的正则表达式技能?
  • @samuelbrody1249 通过练习,您将学习如何为每种情况快速选择最佳模式。要真正学习,您需要研究不同的案例及其解决方案。你可以在 rexegg.com 和 regular-expressions.info 学到很多东西。
【解决方案2】:

如果可以有多个破折号,您可以使用正向预测来断言 32 到 36 个字符。

^(?=[a-z0-9-]{32,36}$)[a-z0-9]+(?:-[a-z0-9]+)*$
  • ^ 字符串开始
  • (?=[a-z0-9-]{32,36}$) 正向前瞻,断言右边是列出的字符的 32 - 36 次重复
  • [a-z0-9]+ 匹配 1 次以上列出的任何一项
  • (?:非捕获组
    • -[a-z0-9]+ 匹配 - 后跟任何列出的 1 次以上(字符串不能以连字符结尾)
  • )*关闭组并匹配0+次也匹配不带破折号的字符串
  • $字符串结束

Regex demo

如果要将破折号的数量限制为0 -4次,可以将量词*改为{0,4}+

^(?=[a-z0-9-]{32,36}$)[a-z0-9]+(?:-[a-z0-9]+){0,4}+$

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2021-08-25
    相关资源
    最近更新 更多