Автор оригинала: Sera.Ng.
Примечание: Весь следующий код тестируется в JDK 8 В предыдущей части я представил основные символы, а также кванторы. В этой части мы будем использовать регулярное выражение для проверки входных данных пользователей:
- Проверьте, вводят ли пользователи целое число
- Проверьте, вводят ли пользователи целое число с фиксированным количеством цифр. Например, пользователь должен ввести полные 4 цифры, например 2018
- Проверьте, вводят ли пользователи минимальное и максимальное количество цифр. Например, пользователи должны ввести не менее 2 цифр, максимум 10 цифр.
- Проверьте, вводят ли пользователи строку, начинающуюся с символов или цифр. Например, пользователи должны ввести строку как ISBN-123-1234
- Проверьте, вводят ли пользователи строку, содержащую специальные символы, такие как!,#, $ и %.
Случай 1: Проверка целого числа
Это пример кода, который мы используем, чтобы проверить, является ли вводимое пользователем положительное целое число
import java.util.Scanner; public class Demo { public static void main(String[] args) { boolean flag; Scanner sc = new Scanner(System.in); do { // must be a digit from 0 - 9 String digit = "\\d"; System.out.print("Input an integer: "); String input = sc.next(); flag = input.matches(digit); if (!flag) System.out.println("You must enter a number!"); } while (!flag); System.out.println("Valid data"); } }
В коде я использую цикл do..while, чтобы попросить пользователя ввести значение. Причина в том, что если пользователи вводят недопустимое значение (не целое число), мы можем попросить пользователей повторно ввести его, не перезапуская программу снова. Вот почему нам нужна переменная с логическим флагом для продолжения цикла или выхода из цикла в случае, если входные данные верны. Я использую java.util. Класс сканера для получения входных данных от пользователей. Есть много способов получить ввод с консоли, но сканер гораздо удобнее. Я использую следующий шаблон для проверки целого числа:
String digit = "\\d";
Обратите внимание, что вам нужно использовать double \. Это связано с тем, что \d-это синтаксис, необходимый для регулярного выражения, но обратная косая черта () – это специальный символ (escape-символ) в Java, поэтому нам нужно использовать двойные обратные косые черты (\) для определения одной обратной косой черты, чтобы избежать (или избежать) ошибок компиляции. В регулярном выражении \d представляет одну цифру от 0 до 9. Поэтому этого простого шаблона достаточно, чтобы проверить наличие допустимого целого числа.
Как только пользователи вводят значение, вызывается метод next (), чтобы получить введенное значение и сохранить его во входной переменной. Обратите внимание, что мы не должны использовать метод nextInt() для получения введенного значения, потому что, если пользователи введут символ или строку, возникнут исключения, которые могут привести к сбою программы. Класс String в Java предоставляет метод, называемый matches(). Этот метод получает параметр в виде шаблона для проверки введенной строки и возвращает значение true или false соответственно.
flag = input.matches(digit);
Результат true/false, возвращаемый функцией matches (), будет сохранен в переменной flag, которая затем будет использоваться для определения того, где следует повторить цикл while. Обратите внимание, что если метод matches() возвращает значение false; это означает, что пользователи ввели недопустимые значения, переменная флага будет иметь значение false. Но так как мы хотим предложить пользователям снова вводить данные, нам нужно изменить значение флага на true, используя оператор NOT (!), чтобы цикл do..while() можно было запустить заново. Это потому, что, как вы, возможно, знали, что do..while (и другие циклы) могут продолжать работать только в том случае, если условие истинно. Теперь пришло время запустить программу:
Input an integer: a You must enter a number! Input an integer: abc You must enter a number! Input an integer: 1a You must enter a number! Input an integer: 3 Valid data
Запустите программу еще раз:
Input an integer: -1 You must enter a number! Input an integer: 12 You must enter a number! Input an integer:
Как вы можете видеть из выходных данных, если пользователи ввели отрицательное число (-1), это было недопустимо, поскольку \d может принимать только положительное целое число от 0 до 9.
Случай 2: Проверка фиксированного количества цифр
В этом случае я также хочу предложить пользователям ввести целое число, но с фиксированным количеством цифр. Например, я хочу получить входные данные в виде 4-значного года, такого как 2017, 2018 и так далее.. Я могу использовать следующий код для выполнения этой задачи:
import java.util.Scanner; public class Demo { public static void main(String[] args) { boolean flag; Scanner sc = new Scanner(System.in); do { String yearPattern = "\\d{4}"; System.out.print("Input a year [4 digits]: "); String input = sc.next(); flag = input.matches(yearPattern); if (!flag) System.out.println("Invalid data!"); } while (!flag); System.out.println("Valid data"); } }
Структура кода аналогична предыдущей. Я только что изменил схему:
String yearPattern = "\\d{4}";
Обратите внимание, что я поместил число 4 в фигурные скобки ({}) сразу после символов \d без пробелов. Число 4 здесь означает, что пользователи должны ввести ровно 4 цифры, не больше и не меньше. Давайте побежим и проверим:
Input a year [4 digits]: 12 Invalid data! Input a year [4 digits]: 123 Invalid data! Input a year [4 digits]: fgd Invalid data! Input a year [4 digits]: 2015 Valid data
Из результатов:
12: this is invalid because there were only 2 digits 123: this is invalid because there there only 2 digits "fgd": this is obvious invalid because it was not an integer number 2015: this is valid because the number contained exactly 4 digits
Случай 3: Проверка целого числа с минимальным и максимальным количеством цифр
В этом случае мы хотим гибко разрешить пользователям вводить целое число с минимальным и максимальным количеством цифр. Например, мы хотим запросить возраст пользователей не менее 10 лет и не более 100 лет.
import java.util.Scanner; public class Demo { public static void main(String[] args) { boolean flag; Scanner sc = new Scanner(System.in); do { String agePattern = "\\d{2,3}"; System.out.print("Input your age: "); String input = sc.next(); flag = input.matches(agePattern); if (!flag) System.out.println("Invalid data!"); } while (!flag); System.out.println("Valid data"); } }
Я определил шаблон следующим образом:
String agePattern = "\\d{2,3}";
В фигурных скобках 2-это минимальное, а 3-максимальное количество разрешенных цифр, разделенных запятой (,) без пробелов между ними. Давайте запустим программу:
Input your age: 1 Invalid data! Input your age: 1001 Invalid data! Input your age: 33 Valid data
Из выходных данных: 1: недопустимо, потому что шаблон требует не менее 2 цифр 1001: недопустимо, потому что шаблон допускает максимум 3 цифры 33: допустимо, потому что он соответствует определенному шаблону
Случай 4: Проверка строки, начинающейся с определенных символов
В этом случае мы попросим пользователей ввести шаблон строки, начинающийся с определенных символов, за которыми следуют определенные цифры. Давайте возьмем в качестве примера ISBN. Предположим, мы хотим, чтобы пользователи вводили ISBN книги со следующим шаблоном:
- Начиная с ISBN, все в верхнем регистре
- За ним следует символ тире (-)
- Далее следуют 5 цифр Некоторые примеры: ISBN-12345, ISBN-98765 Для выполнения этой задачи мы можем использовать следующий код:
import java.util.Scanner; public class Demo { public static void main(String[] args) { boolean flag; Scanner sc = new Scanner(System.in); do { String isbnPattern = "ISBN-\\d{5}"; System.out.print("Input ISBN: "); String input = sc.next(); flag = input.matches(isbnPattern); if (!flag) System.out.println("Invalid data!"); } while (!flag); System.out.println("Valid data"); } }
Это та модель, которая нам нужна:
String isbnPattern = "ISBN-\\d{5}";
Мы начинаем шаблон с прописных букв ISBN, что означает, что пользователи должны указывать именно эти прописные буквы. Затем необходимо ввести символ тире ( -). Наконец, для \d требуется 5 цифр. Мы можем запустить и проверить результаты:
Input ISBN: ISBN12345 Invalid data! Input ISBN: isbn-12345 Invalid data! Input ISBN: ISBN-12345 Valid data
ISBN 12345: неверно, потому что не было символа тире (-) isbn-12345: неверно, потому что isbn весь в нижнем регистре ISBN-12345: действителен, потому что соответствует шаблону
Случай 5: Проверка строки без специальных символов, таких как !, @, # $,….
Очень часто при проверке ввода нам необходимо исключить строку, содержащую специальные символы, по соображениям безопасности. Эти случаи можно найти в разделе проверка имени пользователя в функциях регистрации учетной записи. Например: Допустимыми именами пользователей будут: пользователь 1234, пользователь 9. Недопустимые имена пользователей: пользователь@!123 Давайте взглянем на следующий код:
import java.util.Scanner; public class Demo { public static void main(String[] args) { boolean flag; Scanner sc = new Scanner(System.in); do { String usernamePattern = "\\w+"; System.out.print("Input user name: "); String input = sc.next(); flag = input.matches(usernamePattern); if (!flag) System.out.println("Invalid data!"); } while (!flag); System.out.println("Valid data"); } }
Чтобы выполнить требуемую задачу, я определил простую схему следующим образом:
String usernamePattern = "\\w+";
Символ \w обозначает буквы a-z, A-Z, цифры 0 – 9, и подчеркните. Это связано с тем, что подчеркивания разрешены в большинстве форм регистрации новых имен пользователей. Если в некоторых случаях вы не хотите включать подчеркивания, вы можете применить следующий шаблон: [a-zA-Z0-9] Обратно к нашему шаблону, сразу после \w-знак плюс ( + ), что означает, что пользователи должны ввести по крайней мере один символ в предопределенном шаблоне. Давайте протестируем нашу программу:
Input user name: user@ Invalid data! Input user name: 123#user Invalid data! Input user name: user1234 Valid data
Из результатов:
пользователь@: недопустимо, потому что он содержал символ @ 123#пользователь: недопустимо, потому что он содержал символ # user1234: полностью соответствует шаблону
Предыдущая часть
Следующая часть
—
Посещение learnbyproject.net для бесплатных Курсов регулярного выражения и других бесплатных курсов
Оригинал: “https://www.codementor.io/@seranguyen/java-regular-expression-part-2-matching-text-for-validation-1-r3kua75tx”