正则表达式模式只能过滤2位或更多位数

时间:2015-06-04 13:45:17

标签: regex

整个密码长度为8个字符或更多,1个大写字母或更多,然后一切正常。

我需要一个正则表达式模式来过滤2位或更多位数。这是我的代码,但无法使用2位数字:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])).{8,}

它允许一个或多个数字,但我需要2位或更多位数。

我也试过这个(两者都没有效果):

(?=.*\d{2})(?=.*[a-z])(?=.*[A-Z])).{8,}
(?=.*\d){2})(?=.*[a-z])(?=.*[A-Z])).{8,}

3 个答案:

答案 0 :(得分:2)

要再增加两位数字,只需将\D*\d添加到您的第一个预测中:

^(?=.*\d\D*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$

请参阅demo

最好使用锚点^ abd $作为字符串的开头和结尾。

答案 1 :(得分:1)

它不起作用,因为\d{2}表示两个连续数字,无论字符串中的位置如何,您都需要找到2位数字。所以基本上你可以写:

(?=.*\d.*\d)

您可以通过这种方式改进模式以限制正则表达式的工作:

^(?=\D*\d\D*\d)(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z]).{8,}

^是字符串开头的锚点,使用此锚点,模式仅从字符串的开头进行测试(没有它,模式在字符串中的每个位置进行测试,直到结束)

在您的情况下,不需要字符串锚点的结尾。

\D\d互为排斥,例如[^A-Z][A-Z]。使用\D代替.*可以避免正则表达式引擎回溯。

答案 2 :(得分:0)

好的,所以要求是:

  • > = 8个字符的长度
  • > = 1个大写字母
  • > = 1位数

Perl:

if ( ( length($password) < 8 ) ||
     ( ( $password =~ tr/A-Z/A-Z/ ) < 1 ) ||
     ( ( $password =~ tr/0-9/0-9/ ) < 1 ) )
{
    # Handle faulty password
}

尝试在一个正则表达式中执行所有操作都容易出错,使代码混淆,使其难以维护,更新它需要进一步的要求很难,而且您的同事会讨厌您。