我无法找出以下密码标准的正确正则表达式:
最少2个或更多个大写,2个或更多个小写,2个或更多个数字,1个或多个特殊字符。
(?!^[0-9]*[A-Z][0-9]*$)
(?!^[0-9]*[a-z][0-9]*$)
(?!^[a-zA-Z]*[0-9][a-zA-Z]*$)
我尝试了这个,但如果字符不连续则不匹配:
^([a-z]{2,})$
^([A-Z]{2,})$
^([0-9]{2,})$
感谢您的帮助。
答案 0 :(得分:3)
尝试:
([a-z].*[a-z])
([A-Z].*[A-Z])
([0-9].*[0-9])
请注意,在这种情况下不需要^
和$
。
如果您需要三个或更多字符,这将无法正常工作,因为它会开始变得非常低效。但只有两个或更多,它应该可以正常工作。
答案 1 :(得分:1)
如果你使用正则表达式的任何语言允许预见:
^(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?=.*[0-9].*[0-9)(?=.*[SPECIAL CHARACTERS])
如果您想添加最小长度和/或最大长度,只需将.{min,max}$
附加到正则表达式即可。事实上,可以附加任何其他验证,因为此方法在两个小写字母,两个大写字母,两个数字和一个特殊字符的初始匹配后不消耗字符
答案 2 :(得分:0)
我只是想把它扔出去,虽然技术上可以通过一个正则表达式来验证这一点,但没有条件,从用户体验的角度来看,这样做并不是特别有用。更好的是告诉用户比“你的密码失败”更有用的东西。由于您没有指定您正在使用的语言,因此我将使用php演示更有用的方法:
这是一个示例脚本,它将根据您的要求发出更详细的错误消息。
<?php
if ($_POST['password']) {
$password = $_POST['password'];
preg_match_all('~([a-z])|([A-Z])|([0-9])|(\W)~',$password,$parts);
$lowerAlpha = array_filter($parts[1]);
$upperAlpha = array_filter($parts[2]);
$numbers = array_filter($parts[3]);
$special = array_filter($parts[4]);
$errors = array();
if (count($lowerAlpha)<2) $errors[] = 'at least 2 lowercase letters required';
if (count($upperAlpha)<2) $errors[] = 'at least 2 uppercase letters required';
if (count($numbers)<2) $errors[] = 'at least 2 numbers required';
if (count($special)<1) $errors[] = 'at least one special character required';
if (count($errors)==0) {
// password is great, do something!
} else {
echo "password didn't make the cut for the following reasons:<br/>";
echo "<pre>";
print_r($errors);
echo "</pre>";
}
}
if (!isset($password)) $password = '';
?>
<form action='' method='post'>
<input type='text' name='password' value='<?php echo $password; ?>'>
<input type='submit' value='verify'>
</form>