Java 密码的Regexp

Java 密码的Regexp,java,regex,Java,Regex,我使用java和一个regexp 我制作了一个用于密码验证的regexp: String PASSWORD_PATTERN_ADVANCED = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+]).{8,20}$"; String PASSWORD\u PATTERN\u ADVANCED=“^(?=.\\\\\d)(?=.[a-z])

我使用java和一个regexp

我制作了一个用于密码验证的regexp:

String PASSWORD_PATTERN_ADVANCED = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+]).{8,20}$";
String PASSWORD\u PATTERN\u ADVANCED=“^(?=.\\\\\d)(?=.[a-z])(?=.[\\\\\\\\\\\\$µ§%&.!:?;{-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\\\\\\\\\\\\\\\\\\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
或者没有额外的斜杠:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°"\]\[²³*/+]).{8,20}$
(?=.*.\d)(?=.[a-z])(?=.[a-z])(?=.[\\\\\\\\\\\$µ§%&,!:?;{-\\\\\\\\\\\\\\\\\\\\\\\[\\\\\\\\\\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$
whuch的意思是(我可能错了):至少一个数字/至少一个小写/至少一个大写/至少一个列出的特殊字符/最小总长度为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 
iF\!h6 2A3 | Gm
¨7 gZ2%L.k vd~39
2
我很困惑

有什么想法可以让它工作吗


谢谢

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

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

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

正则表达式可能不是此处作业的正确工具

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

这样的方法可能更适合:

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;

}
公共布尔值isValidPassword(字符串密码){
布尔容器箱;
布尔容器用例;
布尔包含无效;
布尔值包含特殊字符;
布尔包含数字;
for(char c:password.toCharArray()){
containsLowerCase | |=字符。isLowerCase(c);
ContainesSupercase | |=字符.isUpperCase(c);
containsDigit | |=字符.isDigit(c);
ContainessSpecialChar | |=检测设备特殊性的某种方法(c);
}
返回集装箱箱&&
集装箱供应箱&&
包含特殊字符&&
集装箱数字&&
!containsInvalid&&

password.length>=8&&password.length以防万一..你检查过了吗?@hovanesyan不错!这是直接链接。我一定会在我未来的开发中使用它。