Рубрики
Без рубрики

Java Проверяет строку на наличие строчной/прописной буквы, Специального символа и цифры

Узнайте, как проверить, содержит ли строка хотя бы одну заглавную букву, строчную букву, цифру или специальный символ в Java.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы проиллюстрируем, как мы можем проверить, содержит ли строка по крайней мере один из следующих символов: заглавная буква, строчная буква, цифра или специальный символ в Java .

2. Использование Регулярных Выражений

Одним из способов выполнения нашей проверки является использование регулярных выражений. Чтобы ознакомиться с регулярными выражениями, пожалуйста, ознакомьтесь с этой статьей .

Прежде всего, давайте определим регулярное выражение для каждой из требуемых групп символов. Поскольку регулярные выражения фиксированы, нет необходимости оценивать их при каждом запуске, поэтому мы скомпилируем их, прежде чем сравнивать с ними :

private static final Pattern[] inputRegexes = new Pattern[4];

static {
    inputRegexes[0] = Pattern.compile(".*[A-Z].*");
    inputRegexes[1] = Pattern.compile(".*[a-z].*");
    inputRegexes[2] = Pattern.compile(".*\\d.*");
    inputRegexes[3] = Pattern.compile(".*[`[email protected]#$%^&*()\\-_=+\\\\|\\[{\\]};:'\",<.>/?].*");
}

Кроме того, мы должны создать простой метод, который мы будем использовать, чтобы проверить, соответствует ли наша строка | условиям:

private static boolean isMatchingRegex(String input) {
    boolean inputMatches = true;
    for (Pattern inputRegex : inputRegexes) {
        if (!inputRegex.matcher(input).matches()) {
            inputMatches = false;
        }
    }
    return inputMatches;
}

2.1. Одно Регулярное выражение

Предыдущий пример довольно удобочитаем и позволяет нам легко использовать только некоторые шаблоны, если это необходимо. Но в случае, когда мы заботимся только о выполнении всех условий, гораздо эффективнее использовать одно регулярное выражение.

Таким образом, нам не понадобится статический блок для инициализации и компиляции всех наших многочисленных выражений. Кроме того, не было бы необходимости перебирать их все и находить, какие совпадения, а какие нет.

Все, что нам нужно сделать, это объявить наше регулярное выражение:

String regex = "^(?=.*?\\p{Lu})(?=.*?\\p{Ll})(?=.*?\\d)" +
    "(?=.*?[`[email protected]#$%^&*()\\-_=+\\\\|\\[{\\]};:'\",<.>/?]).*$";

А затем скомпилируйте и сравните его:

@Test
public void givenSingleRegex_whenMatchingCorrectString_thenMatches() {
    String validInput = "Ab3;";
    assertTrue(Pattern.compile(regex).matcher(validInput).matches());
}

Есть несколько вещей, на которые мы должны обратить внимание в отношении нашего регулярного выражения.

Во-первых, мы использовали положительный внешний вид ( ?=X ) для каждой группы символов . Это означает, что мы ожидаем , что X будет найден после начала строки (помеченной ^ ), чтобы соответствовать, но мы не хотим идти в конец X , скорее мы хотим остаться в начале строки.

Еще следует отметить, что на этот раз мы не использовали [A-Z] или [az] для групп букв, а вместо этого использовали \p{Lu} и \p{Ll} . Они будут соответствовать любой букве (в нашем случае заглавной и строчной соответственно) из любого языка, а не только английского.

3. Использование ядра Java

Давайте теперь посмотрим, как мы можем выполнить ту же проверку, если мы не хотим использовать регулярные выражения. Мы воспользуемся классами Character и String и их методами, чтобы проверить, присутствуют ли все необходимые символы в нашей String :

private static boolean checkString(String input) {
    String specialChars = "~`[email protected]#$%^&*()-_=+\\|[{]};:'\",<.>/?";
    char currentCharacter;
    boolean numberPresent = false;
    boolean upperCasePresent = false;
    boolean lowerCasePresent = false;
    boolean specialCharacterPresent = false;

    for (int i = 0; i < input.length(); i++) {
        currentCharacter = input.charAt(i);
        if (Character.isDigit(currentCharacter)) {
            numberPresent = true;
        } else if (Character.isUpperCase(currentCharacter)) {
            upperCasePresent = true;
        } else if (Character.isLowerCase(currentCharacter)) {
            lowerCasePresent = true;
        } else if (specialChars.contains(String.valueOf(currentCharacter))) {
            specialCharacterPresent = true;
        }
    }

    return
      numberPresent && upperCasePresent && lowerCasePresent && specialCharacterPresent;
}

Здесь мы должны отметить несколько вещей. Основная идея заключается в том, что мы перебираем нашу Строку и проверяем, соответствуют ли ее символы требуемым типам. Используя класс Character , мы можем легко проверить, является ли определенный символ цифрой, прописным или строчным символом.

К сожалению, нет подобного метода, который бы подсказал нам, имеем ли мы дело с одним из специальных символов. Таким образом, это означает, что нам нужно использовать другой подход.

Мы создали строку |, содержащую все необходимые специальные символы, а затем проверили, содержит ли она наш конкретный символ.

4. Заключение

В этой краткой статье мы показали, как проверить, содержит ли строка | необходимые символы. В первом сценарии мы использовали регулярные выражения, а во втором использовали основные классы Java .

Как обычно, полный исходный код можно найти на GitHub .