Регулярное выражение: как минимум 2 символа или цифры (или смешанные) в Java - PullRequest
1 голос
/ 18 июля 2011

Я знаю, что эти вопросы неубедительны и превращают Stack Overflow в словарь регулярных выражений, но мне действительно нужна помощь. Это все равно что пытаться понять иероглифы (по крайней мере, для кого-то это легкая репутация).

Я хочу написать регулярное выражение, чтобы проверить, если пароль имеет длину не менее 8 символов и содержит как минимум 2 цифры или символы (или смешанные). Символы, вероятно, могут быть очевидными [-+_!@#$%^&*.,?].

Итак, я до сих пор придумал что-то вроде этого: ^(?=.{8,})(?=.*\d{2,}).*$, но я не могу понять, как поместить последовательность символов в часть \d. О, я не уверен, что (? =) Работает на Java, не так ли? Это rubular.com / r / VC0ncbDlRl немного облегчило написание регулярных выражений.

Ответы [ 4 ]

4 голосов
/ 18 июля 2011

Это не работа с 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;
}
3 голосов
/ 18 июля 2011

Еще один способ подсчета чисел и спецпредложений, который «проще» повсюду, с использованием коллекций Commons:

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 голосов
/ 18 июля 2011

Другой ответ хороший, но есть и другой способ:

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 специальных.

0 голосов
/ 18 июля 2011

Как насчет этого:

^(?=.{8,})(.*[-+_!@#$%^&*.,?0-9]){2,}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...