Windows密码正则表达式

时间:2012-07-26 17:24:28

标签: .net regex passwords

我正在尝试使用.NET执行正则表达式,以获得强制执行Windows密码策略要求的密码:

1)长度至少为8个字符

2)包含以下4个类别中的3个字符:

  • 英文大写字母(A..Z)
  • 英文小写字符(a..z)
  • 基数为10位(0..9)
  • 特殊字符

我很棘手的部分是从上面的部分我只需要3个而不是4个规则。有谁知道如何存档?我的注册表在下面;

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

3 个答案:

答案 0 :(得分:2)

就个人而言,我使用单独的正则表达式设置所有四个规则,然后在代码中,我将检查四个匹配中的三个。

简单易读,即使对于那些使用正则表达式的人来说也是如此。 (并非所有的开发人员都对它们很好。让那些糟糕的维护开发人员轻松上手。)

如果其中一条规则发生变化,它也会简化事情。

答案 1 :(得分:1)

使用简单的VB.Net

结束

以下代码;

 Public Function IsPasswordInCorrectFormat(ByVal Password As String) As Boolean
    Dim blnLowerLetter, blnUpperLetter, blnDigit, blnSpecials As New Boolean
    Dim intCorrectSet As New Short

    If Password.Length >= 8 Then
        For Each chrLetter In Password.ToCharArray
            If Not blnLowerLetter AndAlso Char.IsLower(chrLetter) Then blnLowerLetter = True : intCorrectSet += 1
            If Not blnUpperLetter AndAlso Char.IsUpper(chrLetter) Then blnUpperLetter = True : intCorrectSet += 1
            If Not blnDigit AndAlso Char.IsDigit(chrLetter) Then blnDigit = True : intCorrectSet += 1
            If Not blnSpecials AndAlso (Char.IsSymbol(chrLetter) OrElse Char.IsSeparator(chrLetter) OrElse _
                                      Char.IsWhiteSpace(chrLetter) OrElse Char.IsPunctuation(chrLetter)) Then blnSpecials = True : intCorrectSet += 1

            If intCorrectSet >= 3 Then Exit For
        Next
    End If

    Return intCorrectSet >= 3
End Function

答案 2 :(得分:0)

我喜欢这样做。 “按意图编程”。它比同等的正则表达式更容易理解。简单。也可能更快 - 只有一个通过字符串,没有回溯。

如果你也想要,这种方法可以很容易地定义有效性,其中包含你正在寻找的最少数量的角色类别中的角色...至少说明5中的3个。

/// <summary>
/// Determine password validity
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public bool IsPasswordValid(string password)
{
    if ( password == null ) throw new ArgumentNullException() ;

    const int MIN                     =  8    ;
    const int MAX                     = 32    ;
    bool      meetsLengthRequirements = password.Length >= MIN && password.Length <= MAX ;
    bool      hasLeadingWhitespace    = char.IsWhiteSpace( password[0]                     ) ;
    bool      hasTrailingWhitespace   = char.IsWhiteSpace( password[ password.Length - 1 ] ) ;
    bool      hasUpperCaseLetter      = false ;
    bool      hasLowerCaseLetter      = false ;
    bool      hasNumericChar          = false ;
    bool      hasSpecials             = false ;
    bool      hasWhitespace           = false ;

    for (int i = 0; i < password.Length; ++i)
    {
        char ch = password[i];

        hasUpperCaseLetter =  char.IsUpper(       ch ) ;
        hasLowerCaseLetter =  char.IsLower(       ch ) ;
        hasNumericChar     =  char.IsDigit(       ch ) ;
        hasWhitespace      =  char.IsWhitespace(  ch ) ;
        hasSpecials        =  char.IsPunctuation( ch )
                           || char.IsSeparator(   ch )
                           || char.IsSymbol(      ch )
                           ;

    }

    bool isValid = !hasLeadingWhitespace
                && !hasTrailingWhitespace
                && hasUpperCaseLetter
                && hasLowerCaseLetter
                && hasNumericChar
                && ( hasSpecials || hasWhitespace )
                ;
    return isValid ;
}