Регулярные выражения Java: часть 4 — Проверка распространенных форматов: номера телефонов, электронные письма

В этом сеансе мы собираемся использовать регулярное выражение для проверки некоторых общих входных данных: телефонные номера а также адрес электронной почты

Случай 1: Проверка телефонных номеров

Форматы телефонных номеров различаются в зависимости от страны. Это действительно зависит от ваших случаев, чтобы иметь соответствующие регулярные выражения для проверки формата номера телефона.
Допустим, я хочу проверить номера телефонов в следующем формате:

Код страны (3 цифры) – код города (2 цифры) – индивидуальный номер телефона (7 цифр)

Имея это в виду, пользователи должны вводить:

  • Код страны: необходимо ввести 3 цифры, за которыми следует дефис (-).
  • Код города: необходимо ввести 2 цифры, за которыми следует тире (-).
  • Индивидуальный номер телефона: необходимо ввести 7 цифр

Давайте посмотрим следующий код:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        boolean flag;
        Scanner sc = new Scanner(System.in);
        do {
            String phonePattern = "\\d{3}-\\d{2}-\\d{7}";
            System.out.print("Input your phone(xxx-xx-xxxxxxx): ");
            String input = sc.next();
            flag = input.matches(phonePattern);
            if (!flag) System.out.println("Invalid data!");
        } while (!flag);
        System.out.println("Valid data");
    }
}

Основываясь на требуемом формате, я определил шаблон следующим образом:

String phonePattern = "\\d{3}-\\d{2}-\\d{7}";
  • Эта часть предназначена для кода страны, для которого требуется 3 цифры, поэтому я использовал \d{3} для задачи.
  • Вторая часть предназначена для кода города, который содержит 2 цифры, поэтому следует применять \d{2}.
  • Последняя часть предназначена для индивидуального номера телефона, который содержит 7 цифр и, следовательно, \d{7}

Теперь запустите и протестируйте свою программу:

Input your phone(xxx-xx-xxxxxxx): 084-888-1234567
Invalid data!
Input your phone(xxx-xx-xxxxxxx): 084-88-123456
Invalid data!
Input your phone(xxx-xx-xxxxxxx): 084-38-1234567
Valid data

084-888-1234567: недействительно, потому что код города содержит 3 цифры, а для этой части требуется только 2 цифры.
084-88-123456: недействительно, потому что индивидуальный номер телефона содержал только 6 цифр, а этот должен быть 7 цифр
084-38-1234567: полностью соответствует образцу

Случай 2: Проверка формата номера телефона с дополнительной частью с использованием метода группировки

Обычно, когда мы звоним внутри страны (по крайней мере, в моей стране), нам не нужно набирать код страны. Поэтому для пользователей было бы удобно, если бы они могли произвольно вводить код страны.
Чтобы выполнить задачу, мы можем использовать технику, называемую группировкой. Группировка — это механизм, с помощью которого группу символов регулярного выражения можно рассматривать как единое целое. И, группируя определенные символы шаблона в группу, мы можем разрешить пользователям либо вводить всю группу, либо игнорировать всю группу.
Поэтому, чтобы дополнительно разрешить ввод кода страны, мы поместим часть кода страны в группу, за которой следует соответствующий символ квантификатора.
Давайте проверим следующий код:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        boolean flag;
        Scanner sc = new Scanner(System.in);
        do {
            String phonePattern = "(\\d{3}-)?\\d{2}-\\d{7}";
            System.out.print("Input your phone(xxx-xx-xxxxxxx): ");
            String input = sc.next();
            flag = input.matches(phonePattern);
            if (!flag) System.out.println("Invalid data!");
        } while (!flag);
        System.out.println("Valid data");
    }
}

Я определил шаблон следующим образом:

String phonePattern = "(\\d{3}-)?\\d{2}-\\d{7}";

По сути, это та же схема, что и раньше. Но я поставил первую часть (\ д {3}-) в группа с помощью скобок.
Каждый символ, помещенный в скобки, принадлежит группе. У вас может быть столько групп, сколько вы считаете нужным в шаблоне.
После нашей группы здесь знак вопроса (?). Это когда необязательная часть приходит.
Знак вопроса (?) означает 0 или 1, что означает, что пользователи могут игнорировать всю группу; или они могут ввести всю группу, но только один раз. Это имеет смысл, потому что мы не хотим, чтобы код страны появлялся более одного раза.
Пришло время запустить программу:

Input your phone(xxx-xx-xxxxxxx): 123-1234567
Invalid data!
Input your phone(xxx-xx-xxxxxxx): 12-12-1234567
Invalid data!
Input your phone(xxx-xx-xxxxxxx): 084-38-1234567
Valid data

123-1234567: недействительно, потому что код города состоит из 3 цифр.
12-12-1234567: также недействительно, потому что код страны состоял всего из 2 цифр. Обратите внимание, что, поскольку мы помещаем код страны в группу, за которой следует вопросительный знак, пользователи могут игнорировать эту группу. Но если пользователи решат ввести, вся группа должна быть предоставлена
084-38-1234567: полностью соответствует образцу
Запустим программу еще раз:

Input your phone(xxx-xx-xxxxxxx): 38-1234567
Valid data

38-1234567: также верно, потому что мы могли пропустить код страны, остальные части соответствовали шаблону

Случай 3: Проверка форматов электронной почты

В реальных приложениях разные поставщики программного обеспечения требуют разных форматов электронной почты. Не существует единого шаблона, который можно использовать для проверки всех форматов электронной почты. Это действительно зависит от каждого случая, что нам нужен соответствующий подход.
Начнем с простого формата электронной почты:

электронная почта@адрес.com

В этом простом примере электронного письма мы можем разделить до 5 частей:

  • Первая часть — это имя пользователя (электронная почта): эта часть может содержать буквы и цифры, минимум 3 и максимум 15 символов.
  • Вторая часть — это знак @.
  • Третья часть — это доменное имя (адрес): эта часть может содержать буквы и цифры, минимум 3 и максимум 15 символов.
  • Четвертая часть — символ точки (.)
  • Пятая часть — расширение домена (com): эта часть может содержать только буквы алфавита, минимум 2 и максимум 5 символов.

Программа:

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        boolean flag;
        Scanner sc = new Scanner(System.in);
        do {
            String emailPattern = " [a-zA-Z0-9]{3,15}@[a-zA-Z0-9]{3,15}[.][a-zA-Z]{2,5}";
            System.out.print("Input your email(email@address.com): ");
            String input = sc.next();
            flag = input.matches(emailPattern);
            if (!flag) System.out.println("Invalid data!");
        } while (!flag);
        System.out.println("Valid data");
    }
}

В программе у меня был шаблон:

String emailPattern = "[a-zA-Z0-9]{3,15}@[a-zA-Z0-9]{3,15}[.][a-zA-Z]{2,5}";
  • Первая часть может содержать буквы и цифры, поэтому [a-zA-Z0-9] применены. Обратите внимание, что я не использовал \w, потому что \w также включает подчеркивание (_)
  • Вторая часть — это знак @, поэтому я просто поместил его туда.
  • Третья часть — доменное имя. Это похоже на первую часть
  • Четвертая часть — это символ точки (.). Обратите внимание на это. В регулярном выражении точка обозначает любой символ. Но в этой части мы хотим, чтобы пользователи вводили точку, а не какой-либо символ, поэтому нам нужно поместить ее в свободные скобки, чтобы рассматривать ее как обычный символ. Другой способ добиться этого — экранировать символ точки \.
  • Пятая часть — это расширение домена, в котором разрешены только буквенные символы. Итак, узор [a-zA-Z] достаточно.

Теперь запустим программу:

Input your email(email@address.com): email@gmail.
Invalid data!
Input your email(email@address.com): emailgmail.com
Invalid data!
Input your email(email@address.com): email@gmail.com
Valid data

электронная почта@gmail: недопустимо, потому что он пропустил . и расширение домена
электронная почтаgmail.com: недопустимо, потому что не было знака @
электронная почта@gmail.com: полностью совпало с рисунком.

Теперь давайте немного улучшим наш шаблон электронной почты.
У некоторых людей есть адреса электронной почты, например:

электронная почта@gmail.com.us

Как видите, этот адрес электронной почты имеет второе расширение домена (.us). и в связи с этим возникает еще одно требование: мы должны разрешить пользователям при желании вводить другое расширение домена. Но помните, что пользователи либо вводят полностью другое расширение домена, либо не вводят вообще.
Теперь пришло время снова применить технику группировки.
Есть 2 способа выполнить задание, используя технику группировки.
Первый и долгий путь:

String emailPattern = "[a-zA-Z0-9]{3,15}@[a-zA-Z0-9]{3,15}[.][a-zA-Z]{2,5}([.][a-zA-Z]{2,5})?";

Второй и короткий путь:

String emailPattern = "[a-zA-Z0-9]{3,15}@[a-zA-Z0-9]{3,15}([.][a-zA-Z]{2,5}){1,2}";

Я оставлю вас, чтобы вы сами протестировали программу здесь.

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

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

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

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

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

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