1

如何构造一个正则表达式,使我正在制作的密码字段包含至少一个数字、至少一个小写字母和至少一个大写字母,其中顺序无关紧要,并且这些字符之间可以有任何内容?

我试过这个并且得到了类似".*\\d.*[a-z].*[A-Z].*" 的东西:但这要求数字在前,小写在后,大写在后。

4

3 回答 3

3

实现这一目标的一种方法是

1) 首先使用单独的正则表达式检查是否存在小写字母,例如 regex-1。

2)接下来使用另一个正则表达式检查它是否包含数字。

3) 检查任何其他规则。

打破规则将解决您面临的问题,并改善您报告错误的方式。

于 2012-04-21T18:24:20.817 回答
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;
        }
    }
}
于 2012-04-21T18:34:43.167 回答
1

正则表达式不适合像这样的复杂场景。在正则表达式中实现它的唯一方法是列出所有可能性:

(abc|acb|bac|bca|cab|cba)

其中 a、b 和 c 是代表您的个人需求的子模式,例如abcwill 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
);
于 2012-04-21T18:16:52.347 回答