正则表达式检查密码是否为“8个字符,包括1个大写字母,1个特殊字符,字母数字字符”

时间:2012-02-28 07:20:24

标签: c# regex

我想要一个正则表达式来检查

  

密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符。

这是我的验证表达式,包含一个大写字母,一个小写字母和一个数字或特殊字符,用于八个字符。

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

如何为密码编写,密码必须是八个字符,包括一个大写字母,一个特殊字符和一个字母数字字符?

14 个答案:

答案 0 :(得分:130)

你所遵循的正则表达式很可能是巨大的,而且对于那些不熟悉正则表达式的人来说,这是一个噩梦。

我认为打破你的正则表达式并且一次做一点就更容易了。它可能需要做更多的工作,但我很确定维护它并调试它会更容易。这样,您还可以向用户提供更多定向错误消息(仅限Invalid Password),这样可以改善用户体验。

从我所看到的你是非常流利的正则表达式,所以我认为给你正则表达式做你需要的将是徒劳的。

看到你的评论,我就是这样做的:

  • 必须是八个字符长:你不需要正则表达式。使用.Length属性就足够了。

  • 包含一个大写字母:您可以使用[A-Z]+正则表达式。如果字符串包含至少一个大写字母,则此正则表达式将产生true

  • 一个特殊字符:您可以使用\W来匹配任何不是字母或数字的字符,否则,您可以使用类似[!@#]的字符来指定自定义特殊字符列表。请注意,$^()等字符是正则表达式语言中的特殊字符,因此需要对其进行转义:{{1 }}。简而言之,您可以使用\$

  • 字母数字字符:使用\W应匹配任何字母和数字以及下划线。

请查看this教程以获取更多信息。

答案 1 :(得分:98)

(                   # Start of group
    (?=.*\d)        #   must contain at least one digit
    (?=.*[A-Z])     #   must contain at least one uppercase character
    (?=.*\W)        #   must contain at least one special symbol
       .            #     match anything with previous condition checking
         {8,8}      #        length is exactly 8 characters
)                   # End of group

在一行中:

((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})

编辑2019-05-28:

您需要匹配整个输入字符串。因此,您可以将正则表达式括在^$之间,以防止意外地将部分匹配视为匹配整个输入:

^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$

来源:

答案 2 :(得分:29)

这么多答案......都不好!

正则表达式没有AND运算符,因此编写与有效密码匹配的正则表达式非常困难,当有效性由某些东西定义时,其他东西和其他内容...

但是,正则表达式有一个OR运算符,所以只需应用DeMorgan的定理,并编写一个匹配无效密码的正则表达式。

少于8个字符的任何内容任何没有数字的内容任何没有大写的内容任何没有特殊字符的内容

所以:

^(.{0,7}|[^0-9]*|[^A-Z]*|[a-zA-Z0-9]*)$

如果有任何匹配,那么它是无效的密码。

答案 3 :(得分:10)

作为一个例子,如何使用可读/可维护的正则表达式来完成。

对于较长的正则表达式,您应始终使用RegexOptions.IgnorePatternWhitespace来允许表达式中的空白和注释,以提高可读性。

String[] passwords = { "foobar", "Foobar", "Foobar1", "Fooobar12" };

foreach (String s in passwords) {

    Match password = Regex.Match(s, @"
                                      ^              # Match the start of the string
                                       (?=.*\p{Lu})  # Positive lookahead assertion, is true when there is an uppercase letter
                                       (?=.*\P{L})   # Positive lookahead assertion, is true when there is a non-letter
                                       \S{8,}        # At least 8 non whitespace characters
                                      $              # Match the end of the string
                                     ", RegexOptions.IgnorePatternWhitespace);

    if (password.Success) {
        Console.WriteLine(s + ": valid");
    }
    else {
        Console.WriteLine(s + ": invalid");
    }
}

Console.ReadLine();

答案 4 :(得分:9)

答案是不使用正则表达式。这是设定和计数。

正则表达式与订单有关。

在你作为程序员的生活中,你会要求做很多没有意义的事情。学会深入挖掘。了解问题何时出错。

问题(如果提到正则表达式)是错误的。

伪代码(最近在太多语言之间切换):

if s.length < 8:
    return False
nUpper = nLower = nAlphanum = nSpecial = 0
for c in s:
    if isUpper(c):
        nUpper++
    if isLower(c):
        nLower++
    if isAlphanumeric(c):
        nAlphanum++
    if isSpecial(c):
        nSpecial++
return (0 < nUpper) and (0 < nAlphanum) and (0 < nSpecial)

请注意,您几乎可以立即阅读并理解上述代码。打赌你用正则表达式花了更长的时间,并且不太确定它是否正确。扩展正则表达式是有风险的。延伸到上面,更不用说了。

另请注意,问题的措辞是不精确的。字符集是ASCII还是Unicode,还是??我从阅读问题的猜测是假设至少有一个小写字符。所以我认为假设的最后一条规则应该是:

return (0 < nUpper) and (0 < nLower) and (0 < nAlphanum) and (0 < nSpecial)

(将帽子改为以安全为中心,这是真的烦人/无用的规则。)

学会知道问题何时出错,这比聪明的答案更为重要。对错误问题的巧妙回答几乎总是错误的。

答案 5 :(得分:1)

如果您只需要一个大写字母和特殊字符,那么这应该有效:

@"^(?=.{8,}$)(?=[^A-Z]*[A-Z][^A-Z]*$)\w*\W\w*$"

答案 6 :(得分:1)

您正在寻找的正则表达式为:/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u

示例和测试:http://regexr.com/3fhr4

答案 7 :(得分:0)

这个问题开始成为病毒式的,并且出现了很多有趣的建议。

是的,用手写很难。因此,更简单的解决方案是使用模板。尽管产生的正则表达式可能不是最优的,但是维护和/或更改将更容易,并且用户将更好地控制结果。我可能错过了一些东西,所以任何建设性的批评都会有所帮助。

此链接可能很有趣:match at least 2 digits 2 letters in any order in a stringRegular Expression LanguageCapturing groups

我正在使用此模板(?=(?:.*?({type})){({count})})基于我在SO中看到的所有正则表达式。下一步是替换所需的模式(numberspecial character ...)并添加长度配置。

我为编写正则表达式PasswordRegexGenerator.cs做了一个小课程 一个例子:

string result = new PasswordRegexGenerator ( )
        .UpperCase ( 3, -1 )    // ... {3,}
        .Number ( 2, 4 )        // ... {2,4}
        .SpecialCharacter ( 2 ) // ... {2}
        .Total ( 8,-1 )
        .Compose ( );

/// <summary>
/// Generator for regular expression, validating password requirements.
/// </summary>
public class PasswordRegexGenerator
{
    private string _elementTemplate = "(?=(?:.*?({type})){({count})})";

    private Dictionary<string, string> _elements = new Dictionary<string, string> {
        { "uppercase", "[A-Z]" },
        { "lowercase", "[a-z]" },
        { "number", @"\d" },
        { "special", @"\W" },
        { "alphanumeric", @"\w" }
    };

    private StringBuilder _sb = new StringBuilder ( );

    private string Construct ( string what, int min, int max )
    {
        StringBuilder sb = new StringBuilder ( _elementTemplate );
        string count = min.ToString ( );

        if ( max == -1 )
        {
            count += ",";
        }
        else if ( max > 0 )
        {
            count += "," + max.ToString();
        }

        return sb
            .Replace ( "({type})", what )
            .Replace ( "({count})", count )
            .ToString ( );
    }

    /// <summary>
    /// Change the template for the generation of the regex parts
    /// </summary>
    /// <param name="newTemplate">the new template</param>
    /// <returns></returns>
    public PasswordRegexGenerator ChangeRegexTemplate ( string newTemplate )
    {
        _elementTemplate = newTemplate;
        return this;
       }

    /// <summary>
    /// Change or update the regex for a certain type ( number, uppercase ... )
    /// </summary>
    /// <param name="name">type of the regex</param>
    /// <param name="regex">new value for the regex</param>
    /// <returns></returns>
    public PasswordRegexGenerator ChangeRegexElements ( string name, string regex )
    {
        if ( _elements.ContainsKey ( name ) )
        {
            _elements[ name ] = regex;
        }
        else
        {
            _elements.Add ( name, regex );
        }
        return this;
    }

    #region construction methods 

    /// <summary>
    /// Adding number requirement
    /// </summary>
    /// <param name="min"></param>
    /// <param name="max"></param>
    /// <returns></returns>
    public PasswordRegexGenerator Number ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "number" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator UpperCase ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "uppercase" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator LowerCase ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "lowercase" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator SpecialCharacter ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "special" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator Total ( int min, int max = 0 )
    {
        string count = min.ToString ( ) + ( ( max == 0 ) ? "" : "," + max.ToString ( ) );
        _sb.Append ( ".{" + count + "}" );
        return this;
    }

    #endregion

    public string Compose ()
    {
        return "(" + _sb.ToString ( ) + ")";
    }
}

答案 8 :(得分:0)

您可以使用以下类进行验证:

public class PasswordValidator{

  private Pattern pattern;
  private Matcher matcher;

  private static final String PASSWORD_PATTERN =
          "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})";

  public PasswordValidator(){
      pattern = Pattern.compile(PASSWORD_PATTERN);
  }

  /**
   * Validate password with regular expression
   * @param password password for validation
   * @return true valid password, false invalid password
   */
  public boolean validate(final String password){

      matcher = pattern.matcher(password);
      return matcher.matches();

  }
}

其中6和20是密码的最小和最大长度。

答案 9 :(得分:0)

  • 使用非回溯表达式来匹配整个密码(如果它至少包含8个字符)(这样,很长一段时间都不会出现组合爆炸,但是密码无效):(?>{8,})
  • 使用后向断言来检查是否存在所有必需字符(AND条件)。 (?<=...)
  • 至少一个大写字符:(?<=\p{Lu}.*)
  • 至少一个特殊字符(有点模棱两可,但让我们使用非单词):(?<=\W.*)
  • 至少一个字母数字字符(:(?<=\w.*)

总结:

(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)

答案 10 :(得分:0)

Best并非对所有内容都使用正则表达式。这些要求很轻。在CPU上,用于检查条件/验证的字符串操作比正则表达式便宜得多,而且速度更快!

答案 11 :(得分:0)

var regex =/^(?=.*\d)(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z]).{8,64}$/;

 
function test() {

 if(regex.test(document.getElementById("txtPassword").value)===false)
 {
 alert("Min 6,Max 64,At Least One Uppercase Character,One Lowercase Character,One Numeric Value And One Special Character(!@#$%^&*) Required ");
 }
 else
 {
 alert("Success");
 }
}
<input type="text" id="txtPassword" />
<button id="testBtn" onclick=test()>CheckPassword</button>

答案 12 :(得分:0)

我找到的最少 8 个字符的字符,至少包含 1 个小写字母和 1 个大写字母以及 1 个数字和 1 个符号。

^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,})$

答案 13 :(得分:-2)

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