次のことを確認できます。
- 純粋に数字と英数字ではありません(これは、条件が言うよりも少し積極的です)。
- 純粋な小文字や特殊文字ではありません
これを確認する単一の正規表現は次のようになります。
(?![A-Za-z0-9]+$|[a-z{},.<>;:'?/|`~!@#$%^&*()_-+= -]+$).{8,}
あなたの正確な仕様を意図的に無視しました。特に、私は を許可したくPass1234
ありませんでした。また、最大長を設定するのは意味がないと思います。また、許可される文字のセットをまったく制限しませんでした (つまり、最小要件はありますが、暴走してもかまいません。必要に応じて、制御文字またはアクセント付き文字を使用してください)。これらのことは、同意しない場合でも簡単に修正できます。
仕様を厳密に実装するには、パスワードが純粋に任意の 2 つのグループで構成されていないことを確認できます。すべての大文字と小文字、すべての小文字と数字、すべての大文字と数字、すべての数字と特殊文字、すべての小文字と特殊文字、すべての大文字と特殊文字ではありませんが、繰り返しますが、これはやや面倒です。そして私見は逆効果です。
使用している正規表現のフレーバーを言っているのではありません。Perl の否定先読み(?!...)
を自由に使用できると想定しています。従来の BRE または ERE 構文に制限されている場合、これは非常に困難です。