Регулярное выражение 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 бесплатно Курсы по регулярным выражениям и другие бесплатные курсы

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *