我正在尝试使用以下约束检查密码:
~ ! @ # $ % ^ & * ( ) _ - + = { } [ ] | : ; " ' < > , . ?
这是我写的代码:
Pattern pattern = Pattern.compile(
"(?!.*[âêôûÄéÆÇàèÊùÌÍÎÏÐîÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ€£])"
+ "(?=.*\\d)"
+ "(?=.*[a-z])"
+ "(?=.*[A-Z])"
+ "(?=.*[`~!@#$%^&*()_\\-+={}\\[\\]\\\\|:;\"'<>,.?/])"
+ ".{9,}");
Matcher matcher = pattern.matcher(myNewPassword);
if (matcher.matches()) {
//do what you've got to do when you
}
问题是某些字符(例如€
或£
)不会使密码错误。
我不明白为什么这样做是因为我明确地从授权列表中排除了€
和£
。
答案 0 :(得分:0)
而不是试图禁止那些非ascii字符,为什么不让你的正则表达式只接受这样的ASCII字符:
Pattern pattern = Pattern.compile(
"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\\p{Print})\\p{ASCII}{9,})");
另请参阅使用\p{Print}
而不是大字符类。我相信这对你来说已足够了。
答案 1 :(得分:0)
这只允许可打印的Ascii。请注意,它允许使用空格字符,但您可以通过设置\x21
来禁用空格。
编辑 - 我没有看到要求中的数字,在正则表达式中看到了,但不确定。
# "^(?=.*[A-Z])(?=.*[a-z])(?=.*[`~!@#$%^&*()_\\-+={}\\[\\]|:;\"'<>,.?])[\\x20-\\x7E]{9,}$"
^
(?= .* [A-Z] )
(?= .* [a-z] )
(?= .* [`~!@#$%^&*()_\-+={}\[\]|:;"'<>,.?] )
[\x20-\x7E]{9,}
$