0

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

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

谢谢你的帮助。

4

3 回答 3

3

尝试:

([a-z].*[a-z])
([A-Z].*[A-Z])
([0-9].*[0-9])

请注意,在这种情况下不需要^and 。$

如果您需要三个或更多字符,这将不会很好,因为它会开始变得非常低效。但是对于两个或更多,它应该可以正常工作。

于 2013-04-25T23:25:28.257 回答
1

如果您使用正则表达式的任何语言都允许前瞻:

^(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?=.*[0-9].*[0-9)(?=.*[SPECIAL CHARACTERS])

如果您想添加最小和/或最大长度,只需附加.{min,max}$到正则表达式。事实上,可以附加任何其他验证,因为此方法在初始匹配两个小写字母、两个大写字母、两个数字和 1 个特殊字符后不消耗字符

于 2013-04-25T23:26:37.440 回答
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>
于 2013-04-26T00:10:18.883 回答