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 .