1

我需要使用 Java 验证密码字符串。这是验证的要求:

  • 至少 1 个号码
  • 至少 1 个字母字符
  • 集合中至少 1 个字符 !@#$%^&*()_+=-~`][{};':"/.>?,<
  • 8 到 20 个字符

在扭来扭去把我的头撞到墙上几次之后,我想出了这个正则表达式

if (!password.matches("^(?=.+[0-9])(?=.+[a-zA-Z])(?=.+[\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E])[0-9a-zA-Z\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E]{8,20}$")) {

}

这看起来太可怕和疯狂了。有没有更好的方法来完成这个使命?

4

3 回答 3

3

我建议将正则表达式用于他们最擅长的事情,但将代码用于正则表达式做得不好的事情。像这样的东西。(对不起,我没有测试过这段代码,但即使我犯了错误,它也应该给出这个想法并且它不会运行。)

Pattern special_chars = Pattern.compile("[!@#$%^&*()_+=-~`\][{};':\"/.>?,<]");
Pattern number_chars = Pattern.compile("[0-9]");
Pattern letter_chars = Pattern.compile("[a-zA-Z]");

boolean valid;

valid = (special_chars.matcher(password).find() &&
        number_chars.matcher(password).find() &&
        letter_chars.matcher(password).find() &&
        8 <= password.length() && password.length() <= 20);
于 2012-12-17T03:28:28.800 回答
1

用番石榴CharMatcher

// at least 1 number
CharMatcher.inRange('0', '9').countIn(password) >= 1 && 
// at least 1 alphabet character
CharMatcher.inRange('a', 'z').or(inRange('A', 'Z')).countIn(password) >= 1 && 
// at least 1 character from set !@#$%^&*()_+=-~`][{};':"/.>?,<
CharMatcher.anyOf("!@#$%^&*()_+=-~`][{};':\"/.>?,<").countIn(password) >= 1 && 
// 8 to 20 characters
password.length() >= 8 && password.length() <= 20

这假设你想要拉丁字母

于 2012-12-17T03:38:50.443 回答
0

我相信这已经得到了回答。

密码验证的正则表达式

但我可以建议您将验证分为各个类别吗?这样可能会更容易,您将能够准确地告诉用户他们缺少什么。

于 2012-12-17T03:28:05.397 回答