使用Java中的正则表达式进行密码检查

时间:2015-10-11 13:49:00

标签: java regex

我的应用程序具有检查密码的功能。我需要得到这个场景:

密码长度10~32。

它必须是以下两者的组合:

  • 字符和数字
  • 字符和特殊字符
  • 数字和特殊字符

申请中的当前代码:

private boolean isSpecialMixedText(String password)
{
    String number = "[0-9]";
    String english = "[a-zA-Z]";
    String special = "[!@#\\$%^&*()~`\\-=_+\\[\\]{}|:\\\";',\\./<>?£¥\\\\]";

    Pattern numberPattern = Pattern.compile(number);
    Matcher numberMatcher = numberPattern.matcher(password); 

    Pattern englishPattern = Pattern.compile(english);
    Matcher englishMatcher = englishPattern.matcher(password);

    Pattern specialPattern = Pattern.compile(special);
    Matcher specialMatcher = specialPattern.matcher(password);
    return numberMatcher.find() && englishMatcher.find() || specialMatcher.find();
}

请帮我组合工作

2 个答案:

答案 0 :(得分:2)

实际上,正则表达式看起来很好。问题出在这个声明中:

return numberMatcher.find() && englishMatcher.find() || 
       specialMatcher.find();

实际上需要是这样的:

boolean n = numberMatcher.find();
boolean e = englishMatcher.find();
boolean s = specialMatcher.find();
return (n && e) || (n && s) || (e && s);

我同意@ adelphus&#39;评论。您决定使用哪些密码的规则是以英语为中心的。

答案 1 :(得分:0)

在我看来,你的逻辑是错误的,因为你寻找组合(因此只允许这些字符):字符和数字 OR 字符和特殊字符 OR 数字和特殊字符。但是对于像[0-9][a-zA-Z]这样的匹配,您实际上是在寻找带有一些数字和一些字母的字符串,但它也可能是123ABC#$%#$%$#%#$(因为它有字母和数字)

如果给定的字符串仅由允许的字符组合组成,则需要检查的内容。我想你可以在这里使用一个正则表达式(不是太优雅,但有效),如:

^(?:((?=.*[A-Za-z].*)(?=.*[0-9].*)[A-Za-z0-9]{10,32})|((?=.*[-!@#\\$%^&*()~`\=_+\[\]{}|:\";',.\/<>?£¥\\].*)(?=.*[0-9].*)[0-9-!@#\\$%^&*()~`\=_+\[\]{}|:\";',.\/<>?£¥\\]{10,32})|((?=.*[-!@#\\$%^&*()~`\=_+\[\]{}|:\";',.\/<>?£¥\\].*)(?=.*[A-Za-z].*)[-A-Za-z!@#\\$%^&*()~`\=_+\[\]{}|:\";',.\/<>?£¥\\]{10,32}))$

DEMO - 显示有效和无效的匹配。

这是很长的正则表达式,但主要是因为你特殊的字符类。该正则表达式由具有相似结构的三个部分组成:

  

正面lookagead所需字符+字符类   允许的字符

举个例子:

(?=.*[A-Za-z].*)(?=.*[0-9].*)[A-Za-z0-9]{10,32}

表示字符串需要:

  • (?=.*[A-Za-z].*) - 至少一个字母(可以被其他字符包围的字母的正向前瞻),
  • (?=.*[0-9].*) - 至少有一个数字(可以被其他字符包围的数字的正向前瞻)
  • [A-Za-z0-9]{10,32} - 10到32个字母或数字, 实际上,给定的密码需要有10到32个字符,但字母和数字,比例都不重要。

更重要的是,开头的^和最后的$确保整个检查的字符串具有这样的构成。

另外,我同意其他人的意见,最好不要在密码中限制允许的字符,但这是你的决定。