验证字符串 # 后跟数字但 # 在每次出现后增加
Validate string # followed by digits but # increases after every occurance
我有一个字符串看起来像这样
#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)(?|(#)|(#))\d+)+$
,但它似乎根本不起作用
您可以使用 PCRE conditional sub-pattern matching:
^(?:((?(1))#)\d+)++$
正则表达式详细信息:
^
: 开始
(?:
: 启动非捕获组
(
: 开始捕获组#1
(?(1))
: if/then/else
指令意味着仅当第一个捕获组可用时才匹配反向引用 </code> 否则匹配 null</li>
<li><code>#
:匹配额外的#
)
: 结束捕获组#1
\d+
: 匹配 1+ 个数字
)++
:结束非捕获组。匹配此非捕获组的 1+ 个。
$
:结束
一个选项可以选择使用 possessive quantifier ?+#
在每次迭代中添加 # 将反向引用匹配到第 1 组内的第 1 组。
^(?:(?+#)\d+)++$
^
字符串开头
(?:
非捕获组
(?+#)\d+
捕获 组 1,将可选的所有格反向引用与已在组 1 中捕获的内容匹配,并添加匹配 #
后跟 1+位数
)++
关闭非捕获组并占有重复1+次
$
字符串结束
我想你可以在这里使用前向引用:
^(?:((?:(?!^)|^)#)\d+)+$
参见regex demo。
详情:
^
- 字符串开头
(?:((?:(?!^)|^)#)\d+)+
- 出现一次或多次
((?:(?!^)|^)#)
- 第 1 组(</code> 值):字符串的开头或第 1 组值的出现(如果它不在字符串起始位置)</li>
<li><code>\d+
- 一位或多位数字
$
- 字符串结尾。
注意:此技术不适用于不支持前向引用的正则表达式风格,例如基于 ECMAScript 的风格(例如 JavaScript、VBA、 C++ std::regex
)
尽管已经有可行的答案,并且受到 Wiktor 答案的启发,我还是想出了这个主意:
(?:(^#|#)\d+)+$
这也是相当简短和有效的(也适用于非 pcre 环境)。
我有一个字符串看起来像这样
#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)(?|(#)|(#))\d+)+$
,但它似乎根本不起作用
您可以使用 PCRE conditional sub-pattern matching:
^(?:((?(1))#)\d+)++$
正则表达式详细信息:
^
: 开始(?:
: 启动非捕获组(
: 开始捕获组#1(?(1))
:if/then/else
指令意味着仅当第一个捕获组可用时才匹配反向引用</code> 否则匹配 null</li> <li><code>#
:匹配额外的#
)
: 结束捕获组#1\d+
: 匹配 1+ 个数字
)++
:结束非捕获组。匹配此非捕获组的 1+ 个。$
:结束
一个选项可以选择使用 possessive quantifier ?+#
在每次迭代中添加 # 将反向引用匹配到第 1 组内的第 1 组。
^(?:(?+#)\d+)++$
^
字符串开头(?:
非捕获组(?+#)\d+
捕获 组 1,将可选的所有格反向引用与已在组 1 中捕获的内容匹配,并添加匹配#
后跟 1+位数
)++
关闭非捕获组并占有重复1+次$
字符串结束
我想你可以在这里使用前向引用:
^(?:((?:(?!^)|^)#)\d+)+$
参见regex demo。
详情:
^
- 字符串开头(?:((?:(?!^)|^)#)\d+)+
- 出现一次或多次((?:(?!^)|^)#)
- 第 1 组(</code> 值):字符串的开头或第 1 组值的出现(如果它不在字符串起始位置)</li> <li><code>\d+
- 一位或多位数字
$
- 字符串结尾。
注意:此技术不适用于不支持前向引用的正则表达式风格,例如基于 ECMAScript 的风格(例如 JavaScript、VBA、 C++ std::regex
)
尽管已经有可行的答案,并且受到 Wiktor 答案的启发,我还是想出了这个主意:
(?:(^#|#)\d+)+$
这也是相当简短和有效的(也适用于非 pcre 环境)。