作成しているパスワード フィールドに少なくとも 1 つの数字、少なくとも 1 つの小文字、および少なくとも 1 つの大文字が含まれるように正規表現を作成するにはどうすればよいですか?
私はこれを試してみて、似たようなものを得ました:".*\\d.*[a-z].*[A-Z].*"
しかし、数字が最初に来て、小文字が2番目、大文字が最後に来る必要があります.
これを達成する1つの方法は、
1) 最初に、別の正規表現 (regex-1 など) を使用して小文字の存在を確認します。
2) 次に、別の正規表現を使用して数字が含まれているかどうかを確認します。
3) その他のルールを確認します。
ルールを分解すると、直面している問題が解決され、エラーの報告方法も改善されます。
あなたのケースは、正規表現が特に得意とするユース ケースの 1 つではありません。
.*[0-9].*[a-z].*[A-Z].*|.*[0-9].*[A-Z].*[a-z].*|.*[a-z] ... | ...
実際のJavaコードで確認する方が簡単です(そして読みやすくなります):
String password = "";
boolean complies = password.matches(".*[0-9].*")
&& password.matches(".*[a-z].*")
&& password.matches(".*[A-Z].*");
または(醜いですが、おそらくより高速です):
boolean complies = false;
{
boolean hasDigit = false;
boolean hasLowercase = false;
boolean hasUppercase = false;
for (int i = 0; i < password.length(); i++) {
char c = password.charAt(i);
hasDigit |= '0' <= c && c <= '9';
hasLowercase |= 'a' <= c && c <= 'z';
hasUppercase |= 'A' <= c && c <= 'Z';
if (hasDigit && hasLowercase && hasUppercase) {
complies = true;
break;
}
}
}
正規表現は、このような複雑なシナリオには適していません。正規表現で実装できる唯一の方法は、すべての可能性をリストすることです。
(abc|acb|bac|bca|cab|cba)
ここで、a、b、およびcは、個々の要件を表すサブパターンです。たとえば、abc
は、などを表します。このようなモンスターを維持するために頑張ってください。私のヒントは、パーツごとにJava定数を作成することです。.*\\d.*[a-z].*[A-Z].*
bac
[a-z].*.*\\d.*[A-Z].*
private static final String DI = "\\d+";
private static final String LO = "[a-z]+";
private static final String UP = "[A-Z]+";
private static final String WI = ".*";
private static final String OR = "|";
private static final Pattern REGEX = Pattern .compile(
WI + DI + WI + LO + WI + UP + WI + OR
+ WI + LO + WI + DI + WI + UP + WI + OR
// etc
);