誰かが次のパスワードの正規表現を手伝ってくれませんか。
次のうち少なくとも2つを含めます。
小文字、大文字
、
数字
、「特殊文字」(例:£、$、&、#)
誰かが次のパスワードの正規表現を手伝ってくれませんか。
次のうち少なくとも2つを含めます。
小文字、大文字
、
数字
、「特殊文字」(例:£、$、&、#)
キース・トンプソンがコメントで言ったように、私は単一の正規表現がここで価値があるとは思わない。
次のコードはあなたが望むことを実行します、そして私はそれが単一の正規表現よりも読みやすく、保守可能で、正しいことを証明するのが簡単だと思います:
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;
コメントで述べたように、正規表現がこの仕事に適したツールではないことはほぼ確実です。各クラスの文字数を数えて、パスワードの文字を繰り返し処理するコードを作成する方がはるかに簡単です。
「特殊文字」とは何かを定義していません。文字または数字 (スペースや制御文字を含む) 以外の任意の文字を意味すると仮定します。また、「文字」は英語のアルファベットの 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
。