验证字符串 # 后跟数字,但每次出现后都会增加

Hao*_* Wu 6 regex pcre

我有一个看起来像这样的字符串

#123##1234###2356####69
Run Code Online (Sandbox Code Playgroud)

#以任何数字开头,后跟任何数字,每次#出现时,#增加的次数,第一次为 1,第二次为 2,以此类推。

它类似于这个正则表达式,但由于我不知道这种模式持续了多长时间,所以它不是很有用。

^#\d+##\d+###\d+$
Run Code Online (Sandbox Code Playgroud)

我正在使用 PCRE 正则表达式引擎,它允许递归(?R)和条件(?(1)...)等。

是否有正则表达式来验证此模式?

有效的

  • #123
  • #12##235
  • #1234##12###368
  • #1234##12###368####22235#####723356

无效的

  • ##123
  • #123###456
  • #123##456##789

我试过了,^(?(1)(?|(#\1)|(#))\d+)+$但它似乎根本不起作用

anu*_*ava 9

您可以使用PCRE 条件子模式匹配来做到这一点:

^(?:((?(1)\1)#)\d+)++$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

正则表达式详情:

  • ^: 开始
  • (?:: 启动非捕获组
    • (:开始捕获组#1
      • (?(1)\1):if/then/else指令表示\1仅当第一个捕获组可用时才匹配反向引用,否则匹配 null
      • #: 匹配一个额外的 #
    • ):结束捕获组#1
    • \d+: 匹配 1+ 个数字
  • )++: 结束非捕获组。匹配此非捕获组的 1+。
  • $: 结尾


The*_*ird 5

一个选项可以是可选地将反向引用匹配到组 1 内的组 1,使用所有格量词 \1?+#在每次迭代时添加 #。

^(?:(\1?+#)\d+)++$
Run Code Online (Sandbox Code Playgroud)
  • ^ 字符串的开始
  • (?: 非捕获组
    • (\1?+#)\d+捕获第 1 组,将可选的所有格反向引用与第 1 组中已捕获的内容相匹配,并添加匹配的 a#后跟 1+ 数字
  • )++ 关闭非捕获组并占有重复1+次
  • $ 字符串结束

正则表达式演示