整个密码长度为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,}
答案 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)
好的,所以要求是:
Perl:
if ( ( length($password) < 8 ) ||
( ( $password =~ tr/A-Z/A-Z/ ) < 1 ) ||
( ( $password =~ tr/0-9/0-9/ ) < 1 ) )
{
# Handle faulty password
}
尝试在一个正则表达式中执行所有操作都容易出错,使代码混淆,使其难以维护,更新它需要进一步的要求很难,而且您的同事会讨厌您。