1

我使用java和一个正则表达式。

我为密码验证制作了一个正则表达式:

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

或没有额外的斜线:

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

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

做了一个测试用例生成成功和失败的密码......

成功 -> 好的,所有通过失败 -> 几乎可以...

唯一失败的密码: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 

我很困惑。

有什么想法让它起作用吗?

谢谢

4

3 回答 3

1

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

String PASSWORD_PATTERN_ADVANCED = 
         "^(?=[^\\s]*\\d)"
        + "(?=[^\\s]*[a-z])"
        + "(?=[^\\s]*[A-Z])"
        + "(?=[^\\s]*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+])"
        + ".{8,20}$";
于 2012-07-06T14:49:53.837 回答
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)、正则表达式等)的最佳方法。

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

于 2012-07-06T15:17:27.603 回答
0

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

于 2012-07-06T14:46:13.567 回答