验证字符串#后跟数字,但每次出现后都会增加
我有一个看起来像这样的字符串
#123##1234###2356####69
它#以任何数字开头,后跟任何数字,每次#出现时,#增加的次数,第一次为 1,第二次为 2,以此类推。
它类似于这个正则表达式,但由于我不知道这种模式持续了多长时间,所以它不是很有用。
^#d+##d+###d+$
我正在使用 PCRE 正则表达式引擎,它允许递归(?R)和条件(?(1)...)等。
是否有正则表达式来验证此模式?
有效的
#123#12##235#1234##12###368#1234##12###368####22235#####723356
无效的
##123#123###456#123##456##789
我试过了,^(?(1)(?|(#1)|(#))d+)+$但它似乎根本不起作用
回答
您可以使用PCRE 条件子模式匹配来做到这一点:
^(?:((?(1)1)#)d+)++$
正则表达式演示
正则表达式详情:
^: 开始(?:: 启动非捕获组(:开始捕获组#1(?(1)1):if/then/else指令表示1仅当第一个捕获组可用时才匹配反向引用,否则匹配 null#: 匹配一个额外的#
):结束捕获组#1d+: 匹配 1+ 个数字
)++: 结束非捕获组。匹配此非捕获组的 1+。$: 结尾
回答
一个选项可以是可选地将反向引用匹配到组 1 内的组 1,使用所有格量词 1?+#在每次迭代时添加 #。
^(?:(1?+#)d+)++$
^字符串的开始(?:非捕获组(1?+#)d+捕获第 1 组,将可选的所有格反向引用与第 1 组中已捕获的内容相匹配,并添加匹配的 a#后跟 1+ 数字
)++关闭非捕获组并占有重复1+次$字符串结束
正则表达式演示