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

Validate string # followed by digits but # increases after every occurance

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

#123##1234###2356####69

#开头,后面跟着任意数字,每出现一次##的个数就增加,第一次1,第二次2,以此类推

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

^#\d+##\d+###\d+$

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

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

有效

无效

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

您可以使用 PCRE conditional sub-pattern matching:

^(?:((?(1))#)\d+)++$

RegEx Demo

正则表达式详细信息:

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

一个选项可以选择使用 possessive quantifier ?+# 在每次迭代中添加 # 将反向引用匹配到第 1 组内的第 1 组。

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

Regex demo

我想你可以在这里使用前向引用:

^(?:((?:(?!^)|^)#)\d+)+$

参见regex demo

详情:

  • ^ - 字符串开头
  • (?:((?:(?!^)|^)#)\d+)+ - 出现一次或多次
    • ((?:(?!^)|^)#) - 第 1 组(</code> 值):字符串的开头或第 1 组值的出现(如果它不在字符串起始位置)</li> <li><code>\d+ - 一位或多位数字
  • $ - 字符串结尾。

注意:此技术不适用于不支持前向引用的正则表达式风格,例如基于 ECMAScript 的风格(例如 JavaScript、VBA、 C++ std::regex)

尽管已经有可行的答案,并且受到 Wiktor 答案的启发,我还是想出了这个主意:

(?:(^#|#)\d+)+$

这也是相当简短和有效的(也适用于非 pcre 环境)。

test cases