我知道这些问题很蹩脚,并使Stack Overflow像正则表达式字典一样,但我真的需要一些帮助。这就像试图理解象形文字一样(至少对于那些容易名声的人而言)。
我想写一个正则表达式来检查密码是否至少8个字符长,并且至少有2个数字或符号(或混合)。符号可能是明显的符号[-+_!@#$%^&*.,?]
。
所以我到目前为止提出了这样的事情:^(?=.{8,})(?=.*\d{2,}).*$
,但我无法理解如何将符号序列放在\d
部分。哦,我不确定(?=)是否适用于Java,是吗?这个rubular.com/r/VC0ncbDlRl使写正则表达式更容易。
答案 0 :(得分:4)
这不是一项与RegEx有关的工作。在Java中,编写一些自定义代码要简单得多:
public static boolean isValidPassword(String pass)
{
if (pass.length() < 8) return false;
int symbolOrNumberCount = 0;
String symbols = "0123456789-+_!@#$%^&*.,?";
for (int i = 0; i < pass.length(); ++i)
{
if (symbols.indexOf((int) pass.charAt(i)) != -1)
{
symbolOrNumberCount++;
}
}
return symbolOrNumberCount >= 2;
}
答案 1 :(得分:3)
使用Commons Collections计算“简单”数字和特价的另一种方法:
int matches = CollectionUtils.countMatches(
passwordCharacters, new NumberOrSpecialCharacterPredicate());
return passwordCharacters.size() >= 8 && matches >= 2;
class NumberOrSpecialCharacterPredicate implements Predicate {
private static final String symbols = "0123456789-+_!@#$%^&*.,?";
public boolean evaluate(Object object) {
return symbols.indexOf((Character) object) >= 0;
}
}
答案 2 :(得分:2)
另一个答案是好的,但这是另一种方式:
String password = "sn3arki7p";
char[] passwordCharacters = password.toCharArray();
Arrays.sort(passwordCharacters);
String sortedPassword = new String(passwordCharacters);
Pattern pattern = Pattern.compile("^(?=.{8,})(?=.*[-+_!@#$%^&*.,?0-9]{2,}).*$");
System.out.println(pattern.matcher(sortedPassword).matches());
编辑:调整为要求至少2个(数字或特殊)而不是2个数字和2个特殊。
答案 3 :(得分:0)
这个怎么样:
^(?=.{8,})(.*[-+_!@#$%^&*.,?0-9]){2,}