この答えは、1つの正規表現で実行することがどれほど読みにくいかを示すためだけのものです。コードを書くために、他のよりクリーンな代替案を検討してください。
1つの正規表現で実行できますが、恐ろしいです。
^(?:(?=.*[a-z])(?=.*\d)(?=.*[^a-zA-Z0-9\x00-\x1f])|(?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[A-Z])(?=.*\d)(?=.*[^a-zA-Z0-9\x00-\x1f])|(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9\x00-\x1f])).{8,18}$
少し短くすることもできますが、それでも醜いです。
^(?:(?=.*\d)(?=.*[^a-zA-Z0-9\x00-\x1f])(?:(?=.*[a-z])|(?=.*[A-Z]))|(?=.*[a-z])(?=.*[A-Z])(?:(?=.*\d)|(?=.*[^a-zA-Z0-9\x00-\x1f]))).{8,18}$
質問で述べたように、これらのフラグメントに対応する4つの追加条件があります。
(?=.*\d)
:数字の先読み(0-9)
(?=.*[a-z])
:小文字の英語のアルファベット(az)を先読みする
(?=.*[A-Z])
:大文字の英語のアルファベット(AZ)を先読みする
(?=.*[^a-zA-Z0-9\x00-\x1f])
:数字と英語のアルファベット以外の文字を先読みしてください。制御文字も除外されます。
私の知る限り、正規表現には4つの条件のうち3つに一致すると言うメカニズムはありません。したがって、正規表現の大部分を占めるこれらすべての条件を列挙する必要があります。
.{8,18}
任意の文字の8〜18に一致します。そして、正規表現全体がとで固定され^
てい$
ます。