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

在Java中使用正则表达式进行密码检查,java,regex,Java,Regex,我的应用程序具有检查密码的功能。我需要得到这个场景: 密码长度10~32 它必须是以下两者的组合: 字符和数字 人物与特殊人物 数字和特殊字符 应用程序中的当前代码: private boolean isSpecialMixedText(String password) { String number = "[0-9]"; String english = "[a-zA-Z]"; String special = "[!@#\\$%^&*()~`\\-=_+\

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

密码长度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();
}
private boolean是特殊的混合文本(字符串密码)
{
字符串编号=“[0-9]”;
字符串english=“[a-zA-Z]”;
String special=“[!@\\$%^&*()~`\-=\\+\\[\\]{}\\\\\\]:\\\”;,\\./?¥\\\];
Pattern numberPattern=Pattern.compile(数字);
Matcher numberMatcher=numberPattern.Matcher(密码);
Pattern englishPattern=Pattern.compile(英语);
Matcher englishMatcher=englishPattern.Matcher(密码);
Pattern specialPattern=Pattern.compile(特殊);
Matcher specialMatcher=specialPattern.Matcher(密码);
返回numberMatcher.find()&&englishMatcher.find()| | specialMatcher.find();
}

请帮助我使组合工作

实际上,正则表达式看起来很好。问题在下面的语句中:

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的评论。您决定哪些密码是可接受的规则是以英语为中心的。

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

如果给定的字符串仅由允许的字符组合组成,则需要进行检查。我认为您可以在此处使用一个正则表达式(不太优雅,但很有效),如:

表示字符串需要具有:

  • (?=.[A-Za-z].*)
    -至少一个字母(可能被其他字符包围的字母的正向前瞻)
  • (?=.[0-9].*)
    -至少一个数字(可由其他字符包围的数字的正向前瞻)
  • [A-Za-z0-9]{10,32}
    -从10到32个字母或数字, 实际上,给定的密码需要有10到32个字符,但字母和数字的比例并不重要
更重要的是,开头的
^
和结尾的
$
确保了整个检查的字符串具有这样的组成


另外,我也同意其他人的看法,像这样限制密码中允许的字符不是最好的主意,但这是你的决定。

请不要这样做。不是每个人都使用字母a..z键入,特殊字符应该是任何可键入的,而不是字母或数字,而不是碰巧出现在键盘B上的任意字符列表黑板。
^(?:((?=.*[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}))$
(?=.*[A-Za-z].*)(?=.*[0-9].*)[A-Za-z0-9]{10,32}