用于密码验证的正则表达式

本文关键字:正则表达式 验证 密码 用于 | 更新日期: 2023-09-27 17:54:06

我目前使用这个正则表达式来检查字符串是否符合一些条件。

条件如下字符串长度为8 ~ 15个字符。字符串必须至少包含一个数字。字符串必须包含至少一个大写字母。字符串必须包含至少一个小写字母。

(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,15})$

在大多数情况下可以使用,但不允许使用特殊字符。如能帮助修改此正则表达式以允许特殊字符,则不胜感激。

用于密码验证的正则表达式

这里似乎有很多混乱。到目前为止,我看到的答案并没有正确地执行1+数字/1+小写/1+大写规则,这意味着像abc123123XYZAB&^#*这样的密码仍然可以接受。禁止全小写、全大写或全数字是不够的;您必须强制它们至少有一个存在。

尝试以下操作:

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

如果您还希望至少需要一个特殊字符(这可能是一个好主意),请尝试:

^(?=.*[a-z])(?=.*[A-Z])(?=.*'d)(?=.*[^'da-zA-Z]).{8,15}$

如果您愿意,可以将.{8,15}设置得更严格(例如,您可以将其更改为'S{8,15}以禁止空格),但请记住,这样做将降低密码方案的强度。

我已经测试了这个模式,它像预期的那样工作。


编辑:一个小注意,最简单的方法是使用3个单独的正则表达式和字符串的Length属性。它也更容易阅读和维护,所以如果你可以选择这样做。但是,如果这是用于标记中的验证规则,则可能只能使用单个正则表达式。

一个正则表达式是一个更容易/更好的方式来执行一个简单的约束比更明显的方式?

static bool ValidatePassword( string password )
{
  const int MIN_LENGTH =  8 ;
  const int MAX_LENGTH = 15 ;
  if ( password == null ) throw new ArgumentNullException() ;
  bool meetsLengthRequirements = password.Length >= MIN_LENGTH && password.Length <= MAX_LENGTH ;
  bool hasUpperCaseLetter      = false ;
  bool hasLowerCaseLetter      = false ;
  bool hasDecimalDigit         = false ;
  if ( meetsLengthRequirements )
  {
    foreach (char c in password )
    {
      if      ( char.IsUpper(c) ) hasUpperCaseLetter = true ;
      else if ( char.IsLower(c) ) hasLowerCaseLetter = true ;
      else if ( char.IsDigit(c) ) hasDecimalDigit    = true ;
    }
  }
  bool isValid = meetsLengthRequirements
              && hasUpperCaseLetter
              && hasLowerCaseLetter
              && hasDecimalDigit
              ;
  return isValid ;
}

你认为3年后需要修改约束的维护程序员会更容易理解哪一个?

您可以试试这个方法:

    private bool ValidatePassword(string password, out string ErrorMessage)
        {
            var input = password;
            ErrorMessage = string.Empty;
            if (string.IsNullOrWhiteSpace(input))
            {
                throw new Exception("Password should not be empty");
            }
            var hasNumber = new Regex(@"[0-9]+");
            var hasUpperChar = new Regex(@"[A-Z]+");
            var hasMiniMaxChars = new Regex(@".{8,15}");
            var hasLowerChar = new Regex(@"[a-z]+");
            var hasSymbols = new Regex(@"[!@#$%^&*()_+='[{']};:<>|./?,-]");
            if (!hasLowerChar.IsMatch(input))
            {
                ErrorMessage = "Password should contain at least one lower case letter.";
                return false;
            }
            else if (!hasUpperChar.IsMatch(input))
            {
                ErrorMessage = "Password should contain at least one upper case letter.";
                return false;
            }
            else if (!hasMiniMaxChars.IsMatch(input))
            {
                ErrorMessage = "Password should not be lesser than 8 or greater than 15 characters.";
                return false;
            }
            else if (!hasNumber.IsMatch(input))
            {
                ErrorMessage = "Password should contain at least one numeric value.";
                return false;
            }
            else if (!hasSymbols.IsMatch(input))
            {
                ErrorMessage = "Password should contain at least one special case character.";
                return false;
            }
            else
            {
                return true;
            }
        }

更新上面Justin的回答。如果你想在MVC中使用数据注释,你可以这样做

[RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*'d)(?=.*[^'da-zA-Z]).{8,15}$", ErrorMessage = "Password must be between 6 and 20 characters and contain one uppercase letter, one lowercase letter, one digit and one special character.")]

我会逐一检查;例如,查找数字'd+,如果失败,你可以告诉用户他们需要添加一个数字。这样可以避免返回"Invalid"错误而不提示用户错误所在。

试试这个(也纠正了大写和小写的检查,它有一个bug,因为你把它们分组为[a- za -z],它只寻找至少一个小写或大写。所以把它们分开):

(?!^[0-9]*$)(?!^[a-z]*$)(?!^[A-Z]*$)^(.{8,15})$

更新:我发现正则表达式并没有像预期的那样工作,这也不是它应该如何写的!

试试这样写:

(?=^.{8,15}$)(?=.*'d)(?=.*[A-Z])(?=.*[a-z])(?!.*'s).*$

(包含8到15之间,包含至少一个数字,至少一个大写字母和至少一个小写字母,不包含空格)

我认为这也更容易理解

我已经修改了@Anurag在其他问题的答案,以满足我的要求:

需要这个方法返回一个列表,显示哪些地方的密码不符合我的策略,所以首先创建了一个包含所有可能问题的Enum:

public enum PasswordPolicyIssue
{
        MustHaveNumber,
        MustHaveCapitalLetter,
        MustHaveSmallLetter,
        MustBeAtLeast8Characters,
        MustHaveSymbol
}

然后是验证方法,它返回bool值并有一个输出List:

public bool MeetsPasswordPolicy(string password, out List<PasswordPolicyIssue> issues)
{
        var input = password;
        issues = new List<PasswordPolicyIssue>();
        if (string.IsNullOrWhiteSpace(input))
            throw new Exception("Password should not be empty");
        var hasNumber = new Regex(@"[0-9]+");
        var hasUpperChar = new Regex(@"[A-Z]+");
        //var hasMiniMaxChars = new Regex(@".{8,15}");
        var hasMinChars = new Regex(@".{8,}");
        var hasLowerChar = new Regex(@"[a-z]+");
        var hasSymbols = new Regex(@"[!@#$%^&*()_+='[{']};:<>|./?,-]");
        if (!hasLowerChar.IsMatch(input))
            issues.Add(PasswordPolicyIssue.MustHaveSmallLetter);
        if (!hasUpperChar.IsMatch(input))
             issues.Add(PasswordPolicyIssue.MustHaveCapitalLetter);
        if (!hasMinChars.IsMatch(input))
             issues.Add(PasswordPolicyIssue.MustBeAtLeast8Characters);
        if (!hasNumber.IsMatch(input))
             issues.Add(PasswordPolicyIssue.MustHaveNumber);
        if (!hasSymbols.IsMatch(input))
             issues.Add(PasswordPolicyIssue.MustHaveSymbol);
        
        return issues.Count() ==0;
}

@Anurag的原始答案

很长,可以缩短。支持特殊字符?"-_

'A(?=[-'?'"_a-zA-Z0-9]*?[A-Z])(?=[-'?'"_a-zA-Z0-9]*?[a-z])(?=[-'?'"_a-zA-Z0-9]*?[0-9])[-'?'"_a-zA-Z0-9]{8,15}'z

感谢Nicholas Carey。我本来打算先用正则表达式,但你写的东西改变了我的想法。这样维护起来容易多了。

//You can set these from your custom service methods
int minLen = 8;
int minDigit 2;
int minSpChar 2;
Boolean ErrorFlag = false;
//Check for password length
if (model.NewPassword.Length < minLen)
{
    ErrorFlag = true;
    ModelState.AddModelError("NewPassword", "Password must be at least " + minLen + " characters long.");
}
//Check for Digits and Special Characters
int digitCount = 0;
int splCharCount = 0;
foreach (char c in model.NewPassword)
{
    if (char.IsDigit(c)) digitCount++;
    if (Regex.IsMatch(c.ToString(), @"[!#$%&'()*+,-.:;<=>?@[''']{}^_`|~]")) splCharCount++;
}
if (digitCount < minDigit)
{
    ErrorFlag = true;
    ModelState.AddModelError("NewPassword", "Password must have at least " + minDigit + " digit(s).");
}
if (splCharCount < minSpChar)
{
    ErrorFlag = true;
    ModelState.AddModelError("NewPassword", "Password must have at least " + minSpChar + " special character(s).");
}
if (ErrorFlag)
    return View(model);

模式满足以下条件

  1. 密码长度8个字符,最大15个字符
  2. 要求唯一字符
  3. 需要数字
  4. 要求小写
  5. 要求大写
^(?!.*([A-Za-z0-9]))(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,15}$
^^(?=.*[A-Z]{"+minUpperCase+",})(?=.*[a-z]{"+minLowerCase+",})(?=.*[0-9]{"+minNumerics+",})(?=.*[!@#$'-_?.:{]{"+minSpecialChars+",})[a-zA-Z0-9!@#$'-_?.:{]{"+minLength+","+maxLength+"}$