これは、エレガントな正規表現が必要な場合、可能な限り近いものです
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&'])[^ ]{8,}$
基本的な考え方は、「ポジティブ ルックアヘッド」と呼ばれる手法を使用することです。
(?=.*PutHereWhatYouWantToAllow)
追加の要件 4 つのうち 3 つを正規表現で解決するのは簡単ではないため、基本的にそれらをカウントすることはできません。上記の正規表現の必要な順列を書き出すこともできますが (それが意味をなさない場合は教えてください)、非常に長い正規表現になります。あなたができることは、パターンを文字通り繰り返さないので、正規表現が保守可能のままになるように、順列をコードに書き出すことです。
あなたの言語 (C#?) を教えていただければ、挑戦します。
更新 1
これは、要件の少なくとも 3 つ (4 つも許可されます) に一致する正規表現です。これを本番環境で使用しないでください。コメントに記載されているように、個々の正規表現を使用して言語をループします。
^(((?=. [az]. [AZ]. [\d])|(?=. [az]. [\d]. [AZ])|(?=. [AZ]. [az]. [\d])|(?=. [AZ]. [\d]. [az])|(?=. [\d]. [az]. [AZ])|(?=. [\d] . [AZ]. [az])|(?=. [az]. [AZ]. [!@#$%^&'])|(?=. [az]. [!@#$%^& ']. [AZ])|(?=. [AZ]. [az]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [AZ])|(?=. [!@#$%^&']. [AZ]. [ az])|(?=. [az]. [\d]. [!@#$%^&'])|(?=.[az]。[!@#$%^&']。[\d])|(?=. [\d]. [az]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [az])|(?=. [!@#$%^&']. [az]. [\d])|(?=. [!@#$%^&']. [\d] . [az])|(?=. [AZ]. [\d]. [!@#$%^&'])|(?=. [AZ]. [!@#$%^&']. [\d])|(?=. [\d]. [AZ]. [!@#$%^&'])|(?=. [\d]. [!@#$%^&'] . [AZ])|(?=. [!@#$%^&']. [AZ]. [\d])|(?=. [!@#$%^&']. [\d] . [AZ]))[^ ]{8,}$
更新 2
これはJavaでとるアプローチです
私が読んだコメントから、あなたは次のようにテストしています
- 小文字の "^[az]*$";
- 大文字 "^[AZ]*$";
- 数字="^[0-9]*$";
私はあなたがここで正しい軌道に乗っているとは思わない。小文字は、1 文字だけでなく、すべての文字が小文字である場合にのみ成功を報告します。残りの同じ発言。
これらは、少なくとも 3 つが一致を報告する必要がある 4 つの個別の正規表現です。
[a-z]
[A-Z]
\d
[!@#$%^&']
パスワードにスペースを含めないことのテストは次のとおりです。
^[^ ]*$
8文字以上のテスト
.{8,}
したがって、要件を分割し、それらを結合しません。これにより、特に正規表現で始まる場合に、コードが読みやすくなります。