-1

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

1) 长度至少为 8 个字符

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

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

我棘手的部分是,从上面的部分中,我只需要 3 条而不是 4 条规则。有谁知道我该如何存档?我的正则表达式如下;

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

3 回答 3

2

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

简单,易于阅读,即使对于不熟悉正则表达式的人也是如此。(并不是所有的开发人员都对他们很好。让维护能力差的开发人员轻松一些。)

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

于 2012-07-26T17:27:24.780 回答
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
于 2012-07-26T17:55:39.060 回答
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 ;
}
于 2012-07-26T18:05:52.107 回答