正则表达式用于密码验证

des*_*esi 46 .net c# regex

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

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

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

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

Jus*_*gan 81

这里似乎有很多混乱.我看到到目前为止,答案不正确执行1+编号/ 1 +小写/ 1 +大写规则,这意味着如密码ABC123,123XYZ,或AB*&^#仍然会被接受.防止全小写,全大写或全数字是不够的; 你必须强制执行每个中至少一个的存在.

请尝试以下方法:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,15}$
Run Code Online (Sandbox Code Playgroud)

如果你还想要至少一个特殊字符(这可能是一个好主意),试试这个:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,15}$
Run Code Online (Sandbox Code Playgroud)

.{8,15}可以更加严格,如果你WISH(例如,你可以改变它\S{8,15}不允许空格),但请记住,这样做会降低你的密码方案的实力.

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


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

  • 如果你不能使它工作,删除开始和尾随`/` (2认同)
  • 起始和尾随的`/`只是强调这是正则表达式代码.如果您正在使用(例如).NET,则不应包含它们. (2认同)
  • 如果你想要超过8个字符,可以将{8,15}设为.{8,}. (2认同)

Nic*_*rey 42

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

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 ;

}
Run Code Online (Sandbox Code Playgroud)

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

  • 这个客户端javascript与上面的一样复杂. (2认同)
  • @pedram - 为了澄清,我不是在谈论替换 foreach 的内容。我的意思是将该行添加为循环中的最后一步。这样,一旦所有条件都成立,我们就可以立即跳出循环并停止迭代。一旦找到一个大写字母、一个小写字母和一个数字,就无需继续检查其他字符。然后在循环之后,您可以简单地输入“return false”,因为您检查了整个字符串,但没有找到您要查找的所有内容。 (2认同)

小智 10

您可以尝试这种方法:

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • `.{8,15}` 仍然会[匹配 16 个字符的密码](http://regexstorm.net/tester?p=.%7b8%2c15%7d&amp;i=1234567890ABCDEFGHI) (2认同)

小智 5

更新上面的贾斯汀回答。如果您想在 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.")]
Run Code Online (Sandbox Code Playgroud)