-1

Windowsのパスワードポリシー要件を適用するパスワードに.NETを使用して正規表現を実行しようとしています。

1)長さが8文字以上である

2)次の4つのカテゴリのうち3つからの文字が含まれています。

  • 英語の大文字(A..Z)
  • 英語の小文字(a..z)
  • 基数10桁(0..9)
  • 特殊文字

トリッキーな部分は、上記のセクションから、4つのルールではなく3つのルールだけが必要なことです。誰かがそれをアーカイブする方法を知っていますか?私の正規表現は以下のとおりです。

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

3 に答える 3

2

個人的には、個別の正規表現を使用して4つのルールすべてを設定し、コードで4つの一致のうち3つをチェックします。

正規表現が苦手な人でも、シンプルで読みやすいです。(すべての開発者が彼らに満足しているわけではありません。貧弱なメンテナンス開発者を楽にしてください。)

また、ルールの1つが変更された場合も、作業が簡素化されます。

于 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

私はこのようなことをするのが好きです。「意図によるプログラミング」。同等の正規表現よりも理解しやすいです。よりシンプル。おそらくより高速です—文字列を1回通過するだけで、バックトラックはありません。

必要に応じて、このアプローチを使用すると、確認している文字クラスの最小数からの文字を含む有効性を簡単に定義できます...たとえば、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 に答える