C# 用于复杂密码验证的正则表达式

C# 用于复杂密码验证的正则表达式,c#,regex,passwords,C#,Regex,Passwords,我查看了stackoverflow等,但没有找到一个很好的答案。正则表达式支持编写这样的规则吗?如果是这样的话,我们那里有没有任何regex专家可以帮我写这篇文章,我是regex的新手,在时间紧迫的时候 我知道我可以用c#中的一个手动函数,使用c#char,number方法,但是如果可以的话,我想使用正则表达式 要求: 至少8个字符长 2封信 2位数 1大写字母 1小写 1符号 您最好为包含所有这些检查的密码编写一个简单的验证例程 正则表达式似乎不是解决这个特定问题的最佳(或最可扩展)解决

我查看了stackoverflow等,但没有找到一个很好的答案。正则表达式支持编写这样的规则吗?如果是这样的话,我们那里有没有任何regex专家可以帮我写这篇文章,我是regex的新手,在时间紧迫的时候

我知道我可以用c#中的一个手动函数,使用c#char,number方法,但是如果可以的话,我想使用正则表达式

要求:

  • 至少8个字符长
    • 2封信
    • 2位数
    • 1大写字母
    • 1小写
    • 1符号

    • 您最好为包含所有这些检查的密码编写一个简单的验证例程

      正则表达式似乎不是解决这个特定问题的最佳(或最可扩展)解决方案

      if(password.Length < 8)
        return false;
      
      var letters = 0;
      var digits = 0;
      var uppers = 0;
      var lowers = 0;
      var symbols = 0;
      foreach(var ch in password)
      {
         if (char.IsLetter(ch)) letters++;
         if (char.IsDigit(ch)) digits++;
         ....
      } 
      
      if(letters < 2) return false;
      ...
      
      if(password.Length<8)
      返回false;
      var字母=0;
      变量位数=0;
      var uppers=0;
      var=0;
      var符号=0;
      foreach(var ch in密码)
      {
      if(char.IsLetter(ch))字母++;
      if(char.IsDigit(ch))位++;
      ....
      } 
      如果(字母<2)返回false;
      ...
      
      我建议按照Oded的答案去做,但我认为在这种情况下,LINQ是一种更具可读性和明确性的验证机制

      string p = "psW%Rd32";
      return p.Length >= 8 &&
          p.Count(c => char.IsDigit(c)) >= 2 &&
          p.Count(c => char.IsUpper(c)) >= 1 &&
          p.Count(c => char.IsLower(c)) >= 1) ...
      
      你可以使用这个正则表达式

      ^(?=(.*\d){2})(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z\d]).{8,}$
          ---------  --------------------- --------------- -----
              |               |                    |          |->match 8 or more characters
              |               |                    |->match further only if theres anything except letter or digit
              |               |->match further only if there is an upper-lower case letter
              |
              |->match further only if there are two digits anywhere
      

      你可以试试这个方法

       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,8}");
          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 8 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;
          }
      }
      
      private bool ValidatePassword(字符串密码,out-string错误消息)
      {
      var输入=密码;
      ErrorMessage=string.Empty;
      if(string.IsNullOrWhiteSpace(输入))
      {
      抛出新异常(“密码不应为空”);
      }
      var hasNumber=新的正则表达式(@“[0-9]+”);
      var hasUpperChar=新正则表达式(@“[A-Z]+”);
      var hasmimiMaxChars=新正则表达式(@“{8,8}”);
      var hasLowerChar=新正则表达式(@“[a-z]+”);
      var hasSymbols=new Regex(@“[!@$%^&*()”+=\[{\]};:。/?,-]);
      如果(!hasLowerChar.IsMatch(输入))
      {
      ErrorMessage=“密码应至少包含一个小写字母”;
      返回false;
      }
      如果(!hasUpperChar.IsMatch(输入))为else
      {
      ErrorMessage=“密码应至少包含一个大写字母”;
      返回false;
      }
      如果(!hasMiniMaxChars.IsMatch(输入))为else
      {
      ErrorMessage=“密码不应小于或大于8个字符”;
      返回false;
      }
      如果(!hasNumber.IsMatch(输入))为else
      {
      ErrorMessage=“密码至少应包含一个数值”;
      返回false;
      }
      如果(!hasSymbols.IsMatch(输入))
      {
      ErrorMessage=“密码应至少包含一个特殊大小写字符”;
      返回false;
      }
      其他的
      {
      返回true;
      }
      }
      

      如果这些是你要使用的实际规则,我恨你。:)我没有制定这些规则:)正好8个字符或至少8个字符?@MikeChristensen别忘了一个象形文字。正则表达式太复杂了。虽然正则表达式可以工作,但这是一个更易于维护的解决方案。我倾向于此,但我想看看是否有人可以先创建这样的正则表达式..+1,很好,与长正则表达式相比,它是可以想象的,而且更易于维护。@kyleb,我也在尝试,但从我的图片来看,它太长了。虽然我喜欢它,但您在字符串上迭代了多次(每个
      计数一次
      )。返回p.Length==8是错误的。您必须至少有8个字符
      +1
      -虽然需要对字符串进行多次迭代,但它易于阅读且组织良好。我知道您会选择性能。:)我假设这是为了对文本框进行实时验证,而不是事后对数千个密码进行迭代。在本例中,我们实际迭代的字符数不超过12个,在过去15年中,任何CPU都不会感受到任何性能优势。@Damith取决于OP想要强制执行的内容,这只是一个示例。@Anirudh-啊,编辑后,现在可以工作了。。我不会用它,但我会用它来把它拼凑在一起。+1,我从来不知道有这样的东西。
      (?=
      正则表达式。做得很好。我会测试一下,如果它通过了我的验证测试,我会将它标记为答案。谢谢。@kyleb-这样做的一个缺点是你不能告诉用户为什么他们的密码无效,你只能告诉他们密码无效。这是真的,我不能告诉他们出了什么问题,但这不是现在的要求。如果我会转而使用C语言。我更喜欢这种方法。Thanks@NajeebThankss-1:这不符合可访问性标准-所有错误消息都应在一个响应中返回。此方法可能会导致多次尝试相同的输入,并产生不同的错误响应。应该对其进行重构以测试所有规则并返回错误消息错误集合