Регулярное выражение Java: часть 2 — Сопоставление текста для проверки 1

Примечание. Весь следующий код тестируется в 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.Scanner для получения информации от пользователей. Есть много способов получить ввод с консоли, но Scanner намного удобнее.
Я использую следующий шаблон для проверки целого числа:

String digit = “\\d”;

Обратите внимание, что вам нужно использовать двойной \. Это связано с тем, что \d является обязательным синтаксисом регулярного выражения, а обратная косая черта () является специальным символом (символом espcape) в Java, поэтому нам нужно использовать двойную обратную косую черту (\) для определения одиночной обратной косой черты, чтобы избежать (или избежать) ошибок компиляции.
В регулярном выражении \d представляет собой одну цифру от 0 до 9. Следовательно, этого простого шаблона достаточно для проверки допустимого целого числа.

Как только пользователь вводит значение, вызывается метод next(), чтобы получить введенное значение и сохранить его во входной переменной.
Обратите внимание, что мы не должны использовать метод nextInt() для получения введенного значения, потому что, если пользователи вводят символ или строку, будут генерироваться исключения, которые могут привести к сбою программы.
Класс String в Java предоставляет метод Match(). Этот метод получает параметр в качестве шаблона для проверки введенной строки и соответственно возвращает true или false.

flag = input.matches(digit);

Результат true/false, возвращаемый функциейmatches(), будет храниться в переменной флага, которая затем будет использоваться для определения, где должен повторяться цикл while.
Обратите внимание, что если метод match() возвращает 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

ISBN12345: недействителен, так как не было дефиса (-)
isbn-12345: неверно, потому что все isbn в нижнем регистре
ISBN-12345: действителен, поскольку соответствует шаблону.

Случай 5: Проверка строки без специальных символов, таких как !, @, # $,….

Очень часто при проверке ввода нам нужно исключить строку, содержащую специальные символы, из соображений безопасности. Эти случаи можно найти при проверке имени пользователя в функциях регистрации учетной записи.
Например:
Допустимые имена пользователей: user1234, user9adj.
Недопустимые имена пользователей: user@!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 соответствует буквам az, AZ, цифрам от 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

Из выходов:

user@: недействителен, так как содержит символ @
123#user: недействителен, так как содержит символ #
user1234: полностью соответствует шаблону

Предыдущая часть

Следующая часть

Посещать Learnbyproject.net бесплатно Курсы по регулярным выражениям и другие бесплатные курсы

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

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

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