6

誰かが次のパスワードの正規表現を手伝ってくれませんか。

次のうち少なくとも2つを含めます。

小文字、大文字

数字
、「特殊文字」(例:£、$、&、#)

4

3 に答える 3

1

キース・トンプソンがコメントで言ったように、私は単一の正規表現がここで価値があるとは思わない。

次のコードはあなたが望むことを実行します、そして私はそれが単一の正規表現よりも読みやすく、保守可能で、正しいことを証明するのが簡単だと思います:

string password = "123abc";
string[] regexes = new[]
    {
        "[a-z]", //any lowercase word
        "[A-Z]", //any uppercase word
        @"\d", //any digit
        @"\W" //special characters (or just [£$&#], adding the characters you want)
    };
bool isValid = regexes.Count(regex => Regex.IsMatch(password, regex)) >= 2; 
于 2013-03-01T21:21:23.370 に答える
0

コメントで述べたように、正規表現がこの仕事に適したツールではないことはほぼ確実です。各クラスの文字数を数えて、パスワードの文字を繰り返し処理するコードを作成する方がはるかに簡単です。

「特殊文字」とは何かを定義していません。文字または数字 (スペースや制御文字を含む) 以外の任意の文字を意味すると仮定します。また、「文字」は英語のアルファベットの 26 文字だけを指すと想定しています。つまり、英語以外の文字ñは特殊文字です。

より簡単な例を挙げると、正規表現は「foo と bar をどちらの順序でも」などの表現があまり得意ではありません。両方の順序を明示的に指定する必要があります:

 foo.*bar|bar.*foo

この場合、12 の異なる選択肢が必要です。これは正しいと思いますが、テストしていません

[a-z].*[A-Z}|[A-Z].*[a-z}|[a-z].*[0-9]|[0-9].*[a-z]|[a-z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[a-z]|[A-Z].*[0-9]|[0-9].*[A-Z]|[A-Z].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[A-Z]|[0-9].*[^a-zA-Z0-9]|[^a-zA-Z0-9].*[0-9]

これは、egrep スタイルまたは Perl スタイルの正規表現です。デフォルトでgrepは認識しません。スタイルの正規表現|が必要な場合は、それぞれをに置き換えます。grep|\|

また、要件が変更された場合、たとえば 5 クラスの文字のうち少なくとも 3 クラスが必要になった場合は、正規表現を完全に書き直す必要があります。微調整することはできません。

あなたの要件はまだ許可されていることに注意してくださいAa

于 2013-03-01T21:07:10.917 に答える