首页 文章

正则表达式用于密码验证

提问于
浏览
43

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

条件是字符串必须长度在8到15个字符之间 . string必须至少包含一个数字 . string必须至少包含一个大写字母 . string必须至少包含一个小写字母 .

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

它在很大程度上起作用,但它不允许特殊的角色 . 任何帮助修改此正则表达式以允许特殊字符非常感谢 .

9 回答

  • 2

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

    \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
    
  • 2

    试试这个(对大写和小写也进行了校正检查,因为你将它们分组为[a-zA-Z]它只有一个低或高的至少一个它有一个错误 . 所以将它们分开):

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

    Update: I found that the regex doesn't really work as expected and this is not how it is supposed to be written too!

    尝试这样的事情:

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

    (8到15之间,包含至少一个数字,至少一个大写,至少一个小写,没有空格 . )

    我认为这也更容易理解 .

  • 0

    这里似乎有很多混乱 . 到目前为止我看到的答案没有正确执行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} 以禁止空格),但请记住,这样做会降低密码方案的强度 .

    我测试了这种模式,它按预期工作 . Tested on ReFiddle here: http://refiddle.com/110


    Edit: 一个小注释, easiest 方法是使用3个单独的正则表达式和字符串的 Length 属性 . 它's also easier to read and maintain, so do it that way if you have the option. If this is for validation rules in markup, though, you'可能坚持使用单一的正则表达式 .

  • 8

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

    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年后需要修改约束的维护程序员会更容易理解?

  • 2

    您可以尝试这种方法:

    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 less than or greater than 12 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 characters";
                return false;
            }
            else
            {
                return true;
            }
        }
    
  • 77

    我想它应该是这样的:

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

    这将检查您的角色类的约束,然后检查您是否有8到15个字符 . 哪些字符不再重要,因为您已经检查过您的约束是否匹配 .

  • 39

    我会一个一个地检查它们;即查找一个数字 \d+ ,如果失败,您可以告诉用户他们需要添加一个数字 . 这样可以避免返回"Invalid"错误,而不会暗示用户有什么错误 .

  • 0

    谢谢尼古拉斯凯莉 . 我首先要使用正则表达式,但你写的内容改变了我的想法 . 以这种方式维护要容易得多 .

    //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

    可以试试这个:

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

    此外,您可以使用此页面检查正则表达式:

    http://rubular.com/r/ckRwasekcd

相关问题