使用正则表达式验证密码

3

有人可以帮我理解为什么这个不起作用吗?

public boolean validatePassword(String pass){
    final int MIN_LENGTH = 6;// Minimum length 6

    // check if password is correct length and that it does not
    // contain any invalid characters
    if(pass.length() >= MIN_LENGTH && !pass.matches("(.*)[^.-_+!?=a-zA-Z0-9](.*)")){

        // 4 rules, 3 should be fulfilled
        // 1: Contain upper characters (A-Z)
        // 2: Contain lower characters (a-z)
        // 3: Contain numbers (0-9)
        // 4: Contain following character . - _ + ! ? =
        int ruleCount = 0;      // counting fulfilled rules

        if(pass.matches("(.*)[A-Z](.*)")) ruleCount++;
        if(pass.matches("(.*)[a-z](.*)")) ruleCount++;
        if(pass.matches("(.*)[0-9](.*)")) ruleCount++;
        if(pass.matches("(.*)[.-_+!?=](.*)")) ruleCount++;


        if(ruleCount >= 3) return true; // password verified
    }
    // password not verified
    return false;
}

由于某些原因,该程序接受包含大小写字母的密码,并且还会验证包含数字和小写字母的密码有效性。但它只应在符合4个规则中的3个规则时才进行验证。
2个回答

3

您的最后一次检查出现了错误。请注意,-[] 组中表示范围,例如 [A-Z]

在这里不要忘记使用 \\

if(pass.matches("(.*)[.\\-_+!?=](.*)")) ruleCount++;

1
谢谢。那个把我搞糊涂了一会儿,但现在它已经正常工作了。 - Morten Due Christiansen

2
据我所知,matches是Pattern类的一个方法,而非String类的方法。
boolean b = Pattern.matches("a.*", text) ;

你应该使用:

if(Pattern.matches(".*[A-Z].*", pass)) ruleCount++;

还有其他测试等等。


谢谢你的回答。但是没有任何区别。但是通过测试发现,对于一些小写字母和大写字母或数字的模式,它会在“(.*)[.-_+!?=](.*)”上得到积极匹配,这让我感到困惑。 - Morten Due Christiansen
1
它们是同一个方法。String#matches() 方法在底层调用了 Pattern.matches() - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接