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()); }
Има няколко неща, които трябва да отбележим по отношение на регулярния ни израз.
Първо, използвахме положителен lookahead ( ? = X ) за всяка група знаци . Това означава, че очакваме X да бъде намерен след началото на низа (маркиран с ^ ), за да съвпадне, но не искаме да стигаме до края на X , а искаме да останем в началото на реда .
Друго нещо, което трябва да забележите, е, че този път не използвахме [AZ] или [az] за буквени групи, а \ p {Lu} и \ p {Ll} . Те ще съответстват на всякакъв вид букви (в нашия случай съответно с главни и малки букви) от всеки език, не само английски.
3. Използване на Core 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; }
Тук трябва да отбележим няколко неща. Основната идея е, че итерираме нашия String и проверяваме дали символите му са от необходимите типове. Използвайки клас Character , можем лесно да проверим дали даден знак е цифра, главна или малка буква.
За съжаление няма подобен метод, който да ни каже, ако имаме работа с някой от специалните символи. Това означава, че трябва да възприемем друг подход.
Създадохме String, съдържащ всички специални знаци, от които се нуждаем, и след това проверихме дали съдържа нашия специфичен знак.
4. Заключение
В тази бърза статия показахме как да проверим дали даден низ съдържа задължителни символи. В първия сценарий използвахме регулярни изрази, докато във втория се възползвахме от основните Java класове .
Както обикновено, пълен изходен код може да бъде намерен в GitHub.