java - 密码的正则表达式

标签 java regex

我使用 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 

我很困惑。

有什么想法让它发挥作用吗?

谢谢

最佳答案

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

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

像这样的方法可能更合适:

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)、正则表达式等)。

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

关于java - 密码的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11364345/

相关文章:

java - 在同一个文件中序列化多个对象

regex - 如何在 vim 中使用正则表达式来切换文件中所有字符的大小写

.net - 模拟所有格量词

java - 为什么在我的 BST 中序遍历中显示的是指针而不是字符串?

java - Guice:场注入(inject)的影响

java - 异常链在我的代码中如何工作?

java - 正则表达式模式匹配除其中某些字符串之外的模式

java - 有没有办法使用包含变量的正则表达式来替换字符串中的字符

regex - 正则表达式协作开发

java - 如何告诉 Java 使用哪个接口(interface)发送多播数据