正则表达式最小字符/数字

时间:2013-04-25 23:22:02

标签: regex validation passwords

我无法找出以下密码标准的正确正则表达式:

最少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,})$

感谢您的帮助。

3 个答案:

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