我的应用程序具有检查密码的功能。我需要得到这个场景:
密码长度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();
}
请帮我组合工作
答案 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个字符,但字母和数字,比例都不重要。更重要的是,开头的^
和最后的$
确保整个检查的字符串具有这样的构成。
另外,我同意其他人的意见,最好不要在密码中限制允许的字符,但这是你的决定。