我想匹配的是模式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