Regex将数字模式与旋转相匹配



我想匹配的是模式012345678901234567890123456789,还有345678901234567890123456789012。意思是,我想匹配这个模式的前30个字符,但我事先不知道第一个数字。

有没有办法匹配这种模式的任何旋转?

这可以使用交替来完成,但我不确定这在性能方面有多高效:

^(?!.*(?:0[^1]|1[^2]|2[^3]|3[^4]|4[^5]|5[^6]|6[^7]|7[^8]|8[^9]|9[^0]))d{30}$

查看在线演示,其中:

  • ^-启动字符串锚点
  • (?!-打开负面展望:
    • .*-换行符以外的0+个字符
    • (?:-打开非捕获组:
      • 0[^1]|1[^2]|2[^3]|3[^4]|4[^5]|5[^6]|6[^7]|7[^8]|8[^9]|9[^0]-基本上确保所有数字后面都只有相应的后续数字
      • )-关闭非捕获组
    • )-关闭前瞻
  • d{30}-30位
  • $-端柱锚

为了确保任何字符组中的最后一个数字都是正数(没有负数,而是正数(:

编辑

为了适应任何顺序的请求,实际上更好

  • 搜索29位数字,后跟正确数字
  • 后面跟一个数字,前面跟一个右边的数字:

仅为可读性添加换行符!

(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){29}
((?<=0)1|(?<=1)2|(?<=2)3|(?<=3)4|(?<=4)5|(?<=5)6|(?<=6)7|(?<=7)8|(?<=8)9|(?<=9)0)

这在我看来非常完美:(

第一个解决方案在I a行的31位数字上失败

(0(?=1|[^d])|1(?=2|[^d])|2(?=3|[^d])|3(?=4|[^d])|4(?=5|[^d])|5(?=6|[^d])|6(?=7|[^d])|7(?=8|[^d])|8(?=9|[^d])|9(?=0|[^d])){30}

这搜索30个数字0到9,然后是它们的后续数字或不是数字:

https://regex101.com/r/rTYByt/1

最新更新