密码的正则表达式

时间:2012-07-06 14:38:50

标签: java regex

我使用java和regexp。

我已经为密码验证做了一个正则表达式:

String PASSWORD_PATTERN_ADVANCED = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+]).{8,20}$";

或没有额外的斜线:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°"\]\[²³*/+]).{8,20}$

这意味着(我可能错了):至少一个数字/至少一个小写/至少一个大写/至少一个列出的特殊字符/最小总长度为8,最大为20 ..

制作了一个测试用例,为成功和失败生成密码......

成功 - &gt;好的,一切都过去了 失败 - &gt;差不多好......

唯一未能失败的密码:D是包含空格的密码,如:

 iF\ !h6 2A3|Gm 
¨I O7 gZ2%L£k vd~39 
2< A Uw a7kEw6,6S^ 
cC2c5N#  
6L kIw~ Béj7]5 
ynRZ #44ç 
9A `sè53Laj A 
s²R[µ3  9UrR q8n 

我很困惑。

有什么想法让它有用吗?

由于

3 个答案:

答案 0 :(得分:1)

我可能错了,但如果你只是不想要空格,那么在你的前瞻中使用[^\\s]代替.

String PASSWORD_PATTERN_ADVANCED = 
         "^(?=[^\\s]*\\d)"
        + "(?=[^\\s]*[a-z])"
        + "(?=[^\\s]*[A-Z])"
        + "(?=[^\\s]*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+])"
        + ".{8,20}$";

答案 1 :(得分:1)

正则表达式可能不适合这里的工作。

正则表达式最适合匹配模式;你所描述的并不是一种真正的模式本身;它更像是一个规则集。当然,你可以创建一些有用的正则表达式,但它是一个非常复杂和不透明的代码片段,使维护成为一个挑战。

这样的方法可能更合适:

public boolean isValidPassword(String password) {
    boolean containsLowerCase;
    boolean containsUpperCase;
    boolean containsInvalid;
    boolean containsSpecialChar;
    boolean containsDigit;

    for(char c: password.toCharArray()) {
        containsLowerCase   ||= Character.isLowerCase(c);
        containsUpperCase   ||= Character.isUpperCase(c);
        containsDigit       ||= Character.isDigit(c); 
        containsSpecialChar ||= someMethodForDetectingIfItIsSpecial(c);

    }

    return  containsLowerCase &&
            containsUpperCase &&
            containsSpecialChar &&
            containsDigit &&
            !containsInvalid &&
            password.length >=8 && password.length <=20;

}

您需要确定检测特殊字符(specialCharArray.contains(c),正则表达式等)的最佳方法。

然而,这种方法会使添加新规则变得更加简单。

答案 2 :(得分:0)

您的所有条件都没有说明不能在密码中,只有必须。您还需要一个组合所有可能有效字符的条件,并确保密码中的所有字符都在该列表中(即(\d|[a-z]|[A-Z]|@#$...){8,20}作为最终条件)。这个或被拒绝的字符列表。