带或不带破折号的正则表达式匹配校验和

Regex match checksum with or without dashes

为了匹配无破折号的校验和,我可以这样做:

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

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

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

虽然这可能是一个固定大小,先是 8,然后是 4,然后是 4,然后是 4,然后是 12,但我想知道我是否可以做一个正则表达式,其中非短划线数字的数量 adds最多 32。我认为答案是否定的,但希望一些正则表达式向导可以想出一些东西。

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

您可以使用

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

参见regex demo

匹配

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

如果你不介意尾随 - 如果后面有一个单词 char,在匹配结束时,你也可以使用

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

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

如果可以有多个破折号,您可以使用肯定的先行断言 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