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