regex 我如何创建一个正则表达式来避免一个带有可选连字符的重复数字?

qrjkbowd  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我已经被这个问题困扰了好几天了。我需要一个正则表达式来验证这个格式的ID:

^[0-9]{2}[-]{0,1}[0-9]{7}$

但从这个模式中,我必须排除这样的集合:

  • 00-0000000和00000000
  • 11-1111111和111111111
  • 22日至2222222日和22222222日
  • ...
  • 99-9999999和99999999

请注意,22-2222221是有效的。
有人能帮助我吗?如果ID中没有破折号,我可以使用^(\d)(?!\1{8})\d{8}$,但如果有连字符怎么办?
尝试过类似

^(\d)(?!\1{8})\d{8}$|^(\d)(?!\1{2})\d{1}-(?!\1{7})\d{7}$

但是第二部分似乎不能正常工作。
感谢Wiktor提供的解决方案。你会如何调整它以适应下面的模式呢?
^[0-9]{3}[-]{0,1}[0-9]{2}[-]{0,1}[0-9]{4}$
也许这样的方法可以奏效:^(?!(\d)(?:-?\1)*$)\d{3}-?\d{2}-?\d{4}$

8cdiaqws

8cdiaqws1#

您可以使用

^(?!(\d)(?:-?\1)*$)\d{2}-?\d{7}$

请参见regex demo

  • 详细信息 *:
  • ^-字符串开始
  • (?!(\d)(?:-?\1)*$)-如果存在以下情况,则匹配失败的负前瞻
  • (\d)-一位数字(在第1组中采集)
  • (?:-?\1)*-可选-的零个或多个序列,然后是组2中捕获的数字
  • $-字符串结尾,紧靠当前位置的右侧
  • \d{2}-?\d{7}-两位数,可选的-,然后是七位数
  • $-字符串结束。

相关问题