我使用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
我很困惑。
有什么想法让它有用吗?
由于
答案 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}
作为最终条件)。这个或被拒绝的字符列表。