如何构造一个正则表达式,使我正在制作的密码字段包含至少一个数字、至少一个小写字母和至少一个大写字母,其中顺序无关紧要,并且这些字符之间可以有任何内容?
我试过这个并且得到了类似".*\\d.*[a-z].*[A-Z].*"
的东西:但这要求数字在前,小写在后,大写在后。
实现这一目标的一种方法是
1) 首先使用单独的正则表达式检查是否存在小写字母,例如 regex-1。
2)接下来使用另一个正则表达式检查它是否包含数字。
3) 检查任何其他规则。
打破规则将解决您面临的问题,并改善您报告错误的方式。
你的不是正则表达式特别擅长的用例之一——如果你坚持使用正则表达式,我想你别无选择,只能列举 6 种情况:
.*[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
will be .*\\d.*[a-z].*[A-Z].*
、bac
代表[a-z].*.*\\d.*[A-Z].*
等。祝您好运,维护这样一个怪物。我的建议是为每个部分创建 java 常量:
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
);