Регулярное выражение Java: часть 3 — Сопоставление текста для проверки 2
В последней части мы использовали несколько простых шаблонов для проверки ввода. В этой части мы собираемся применить несколько более сложных шаблонов, в том числе:
- Проверка числа в определенном диапазоне, не обязательно от 0 до 9.
- Проверка символа в определенном диапазоне, не обязательно от a до z.
- Проверка как цифр, так и символов в заранее определенных диапазонах
- Проверка строки, содержащей предопределенные символы
- Проверка строки, не содержащей предопределенных символов
Случай 1: Проверка числа в определенном диапазоне
Предположим, мы просим пользователей ввести номер своего домашнего адреса, который должен быть: минимум одной цифрой, максимум 3 цифрами, а цифры должны быть от 5 до 9. Это означает, что цифры от 0 до 4 не допускаются.
С этими требованиями у меня есть следующий код:
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
boolean flag;
Scanner sc = new Scanner(System.in);
do {
String addressPattern = "[5-9]{1,3}";
System.out.print("Input your house number: ");
String input = sc.next();
flag = input.matches(addressPattern);
if (!flag) System.out.println("Invalid data!");
} while (!flag);
System.out.println("Valid data");
}
}
В приведенном выше коде наиболее важной частью является шаблон:
String addressPattern = "[5-9]{1,3}";
В этом шаблоне я использовал квадратные скобки с цифрами 5-9 внутри. Это означает, что совпадающие цифры должны быть от 5 до 9, не обязательно в каком-то определенном порядке. Сразу после этого идет ограничение на минимальное и максимальное количество цифр {1,3}, с которым вы уже должны быть знакомы.
Давайте запустим программу с некоторыми примерами входных данных:
Input your house number: a
Invalid data!
Input your house number: 156
Invalid data!
Input your house number: 78
Valid data
а: явно неверно, потому что это не цифра
156: недействительно, так как цифра 1 не находится в диапазоне от 5 до 9
78: полностью верно, потому что обе цифры 7 и 8 находятся в диапазоне от 5 до 9, а также в допустимом пределе
Случай 2: Проверка символа в определенном диапазоне
Как и в предыдущем случае, мы также можем потребовать от пользователей ввести символ, который должен лежать в определенном диапазоне.
Например, мы просим пользователей ввести свой домашний адрес, название улицы, которое должно иметь только:
- Буквы верхнего регистра A – E в том числе: A, B, C, D, E
- Буквы верхнего регистра G – N в том числе: G, H, I, J, K, L, M, N
Взгляните на следующий код:
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
boolean flag;
Scanner sc = new Scanner(System.in);
do {
String addressPattern = "[A-EG-N]{2,8}";
System.out.print("Input your street name: ");
String input = sc.next();
flag = input.matches(addressPattern);
if (!flag) System.out.println("Invalid data!");
} while (!flag);
System.out.println("Valid data");
}
}
В приведенном выше коде я определил шаблон:
String addressPattern = "[A-EG-N]{2,8}";
Как и в предыдущем случае, я использовал квадратные скобки ([]), чтобы определить желаемые диапазоны символов. Однако в этом случае нам нужно указать 2 диапазона символов:
- Первый диапазон от A до E должен быть в верхнем регистре.
- Второй диапазон — от G до N и должен быть в верхнем регистре.
Обратите внимание, что между символами диапазона нет пробела. И также нет необходимости следовать какому-то определенному порядку, если вводимые символы находятся в диапазоне от A до E или от G до N.
И я уверен, что вы знаете значение {2,8}.
Запустим программу и получим следующие результаты:
Input your street name: AEF
Invalid data!
Input your street name: OP
Invalid data!
Input your street name: gek
Invalid data!
Input your street name: GEK
Valid data
AEF: недопустимо, так как F не находится в указанных диапазонах
ОП: недействителен по той же причине
gek: недопустимо, потому что, хотя все символы находятся в указанных диапазонах, все они были строчными буквами
ГЕК: полностью совпало с шаблоном
Случай 3: Проверка как цифр, так и символов в заранее определенных диапазонах
Нет причин мешать нам объединять символы и цифры в требуемые диапазоны.
Следующий код должен быть объяснен сам по себе:
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
boolean flag;
Scanner sc = new Scanner(System.in);
do {
String addressPattern = "[1-5A-EG-N]{2,8}";
System.out.print("Input your street name: ");
String input = sc.next();
flag = input.matches(addressPattern);
if (!flag) System.out.println("Invalid data!");
} while (!flag);
System.out.println("Valid data");
}
}
Опять же, порядок в квадратных скобках не важен.
Если вам сложно понять, то вот:
- вводимые цифры должны быть от 1 до 5
- вводимые символы должны быть в верхнем регистре и от A до E или от G до N
- вводимых символов должно быть не менее 2 и не более 8 символов
- нет, пока пространство разрешено
Запустите программу:
Input your street name: 8ACD
Invalid data!
Input your street name: Gc123
Invalid data!
Input your street name: GC123
Valid data
8ACD: недопустимо, так как ввод содержит цифру, которая не находится в диапазоне от 1 до 5.
Gc123: неверно, так как буква c не в верхнем регистре
GC123: полностью соответствует шаблону
Случай 4: Проверка строки, содержащей предопределенные одиночные символы
Помимо ограничений с использованием диапазонов, мы также можем использовать символы диапазона ([]) для наложения на предопределенные одиночные символы
Давайте посмотрим на следующий пример:
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
boolean flag;
Scanner sc = new Scanner(System.in);
do {
String addressPattern = "[1357ASDF]+";
System.out.print("Input your street name: ");
String input = sc.next();
flag = input.matches(addressPattern);
if (!flag) System.out.println("Invalid data!");
} while (!flag);
System.out.println("Valid data");
}
}
Шаблон:
String addressPattern = "[1357ASDF]+";
имеет значение:
- входная строка должна содержать одну из следующих цифр: 1, 3, 5, 6 и заглавные буквы: A, S, D, F
- должен быть указан как минимум 1 символ, так как мы использовали знак плюс (+)
Запускаем программу и получаем:
Input your street name: 12ASD
Invalid data!
Input your street name: 13ACB
Invalid data!
Input your street name: AD57
Valid data
12ASD: недопустимо, поскольку цифра 2 не была одной из предопределенных цифр.
13ACB: недопустимо, поскольку буквы C и B не были одними из предопределенных символов
AD57: полностью соответствует образцу
Случай 5: Проверка строки, не содержащей предопределенных символов
Вместо проверки строки, содержащей символы в заранее определенных диапазонах, мы можем сделать обратное, то есть строка не должна содержать определенные символы.
Давайте посмотрим пример:
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
boolean flag;
Scanner sc = new Scanner(System.in);
do {
String addressPattern = "[^1357ASDF]+";
System.out.print("Input your street name: ");
String input = sc.next();
flag = input.matches(addressPattern);
if (!flag) System.out.println("Invalid data!");
} while (!flag);
System.out.println("Valid data");
}
}
Посмотрите внимательно на узор:
String addressPattern = "[^1357ASDF]+";
Шаблон выглядит так же, как и в предыдущем примере, с одним существенным отличием: символом вставки (^). Знак вставки (^) означает «кроме». Таким образом, шаблону будут соответствовать строки, содержащие любые символы, кроме одного из символов 1357ASDF.
Запустите программу:
Input your street name: 135ASDF
Invalid data!
Input your street name: QWE
Valid data
135ASDF: недопустимо, поскольку не разрешены все символы в строке.
QWE: полностью действителен, потому что не было запрещенных символов
Предыдущая часть
Следующая часть
—
Посещать Learnbyproject.net бесплатно Курсы по регулярным выражениям и другие бесплатные курсы