正则表达式为无限数字但限制其他字符

时间:2017-02-02 13:35:08

标签: php regex preg-match

我正在尝试找到无限数字但有限下划线的正则表达式。

让我们说max_underscore = 3

然后

123_456_678没问题(3个下划线)
1234213_2132135678没问题(2个下划线)

但是

13_4156_7_012_1不正常(4个下划线)

2 个答案:

答案 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+