我正在尝试找到无限数字但有限下划线的正则表达式。
让我们说max_underscore = 3
。
然后
123_456_678
没问题(3个下划线)
1234213_2132135678
没问题(2个下划线)
但是
13_4156_7_012_1
不正常(4个下划线)
答案 0 :(得分:2)
如果在开头或结尾不允许使用下划线,则不允许有2个或更多连续下划线:
^(?:\d+_?){3}\d+$
如果在开头或结尾允许下划线:
^(?:\d*_?){3}\d*$
这些正则表达式匹配字符串,其中0到3个下划线但不多。
查看这两个正在运行的正则表达式:
$strings = array(
'123456',
'1_2_3_456',
'123_456',
'_123_456_',
'1_2_3_4_5_6',
'123___456',
);
$num = 3;
echo 'using "^(?:\d+_?){3}\d+$"',"\n";
foreach($strings as $string) {
if (preg_match("/^(?:\d+_?){".$num."}\d+$/", $string)) {
echo "OK: $string\n";
} else {
echo "KO: $string\n";
}
}
echo 'using "^(?:\d*_?){3}\d*$"',"\n";
foreach($strings as $string) {
if (preg_match("/^(?:\d*_?){".$num."}\d*$/", $string)) {
echo "OK: $string\n";
} else {
echo "KO: $string\n";
}
}
<强>输出:强>
using "^(?:\d+_?){3}\d+$"
OK: 123456
OK: 1_2_3_456
OK: 123_456
KO: _123_456_
KO: 1_2_3_4_5_6
KO: 123___456
using "^(?:\d*_?){3}\d*$"
OK: 123456
OK: 1_2_3_456
OK: 123_456
OK: _123_456_
KO: 1_2_3_4_5_6
OK: 123___456
答案 1 :(得分:1)
如果可以,请代表其他每个角色。
例如,有3个下划线:
\d*_\d*_\d*_\d*
如果你想匹配3个或更少的下划线,你可以使正则表达式的一部分可选:
\d*(_\d*(_\d*(_\d*)?)?)?
请注意,这允许在字符串的开头和结尾连续两个下划线和下划线,使用+
而不是*
可以避免这种情况:
\d+_\d+_\d+_\d+