正则表达式:Java中至少有2个符号或数字(或混合)

时间:2011-07-17 22:45:16

标签: java regex

我知道这些问题很蹩脚,并使Stack Overflow像正则表达式字典一样,但我真的需要一些帮助。这就像试图理解象形文字一样(至少对于那些容易名声的人而言)。

我想写一个正则表达式来检查密码是否至少8个字符长,并且至少有2个数字或符号(或混合)。符号可能是明显的符号[-+_!@#$%^&*.,?]

所以我到目前为止提出了这样的事情:^(?=.{8,})(?=.*\d{2,}).*$,但我无法理解如何将符号序列放在\d部分。哦,我不确定(?=)是否适用于Java,是吗?这个rubular.com/r/VC0ncbDlRl使写正则表达式更容易。

4 个答案:

答案 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,}