Как проверить, соответствует ли строка формату телефонного номера в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь проверять, соответствует ли строка формату телефонного номера на Java с использованием регулярных выражений (Regex). Мы начнем с создания шаблона Regex, специально разработанного для сопоставления с общими форматами телефонных номеров.

После этого вы будете проверять заданную строку с телефонным номером на соответствие созданному шаблону Regex с использованием класса Matcher в Java. Наконец, вы узнаете, как обрабатывать и сопоставлять различные варианты форматов телефонных номеров путем настройки шаблона Regex.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/StringManipulationGroup -.-> java/regex("RegEx") subgraph Lab Skills java/regex -.-> lab-559991{{"Как проверить, соответствует ли строка формату телефонного номера в Java"}} end

Создание регулярного выражения для телефонного номера

На этом этапе мы узнаем о регулярных выражениях (Regex) и о том, как создать такое выражение для сопоставления с телефонными номерами. Регулярные выражения - это мощный инструмент для поиска шаблонов в строках. Они похожи на специальный язык для описания текстовых шаблонов.

Зачем нам нужны регулярные выражения для телефонных номеров? Телефонные номера могут иметь различные форматы (например, 123-456-7890, (123) 456-7890, 123.456.7890). Регулярные выражения позволяют нам определить шаблон, который будет соответствовать всем этим вариантам.

Давайте создадим простую программу на Java, которая использует регулярные выражения для проверки, является ли строка телефонным номером.

  1. Откройте файл HelloJava.java в редакторе WebIDE, если он еще не открыт.

  2. Замените все содержимое файла следующим кодом:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String phoneNumber = "123-456-7890"; // Строка для проверки
            String regex = "\\d{3}-\\d{3}-\\d{4}"; // Регулярное выражение
    
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(phoneNumber);
    
            boolean isMatch = matcher.matches();
    
            if (isMatch) {
                System.out.println(phoneNumber + " является допустимым форматом телефонного номера.");
            } else {
                System.out.println(phoneNumber + " не является допустимым форматом телефонного номера.");
            }
        }
    }

    Давайте рассмотрим новые части этого кода:

    • import java.util.regex.Matcher; и import java.util.regex.Pattern;: Эти строки импортируют необходимые классы для работы с регулярными выражениями в Java.
    • String phoneNumber = "123-456-7890";: Это строка, которую мы хотим проверить.
    • String regex = "\\d{3}-\\d{3}-\\d{4}";: Это наше первое регулярное выражение. Разберем его:
      • \\d: Соответствует любой цифре (от 0 до 9). Мы используем \\, потому что \ - это специальный символ в строках Java, поэтому его нужно экранировать.
      • {3}: Соответствует предыдущему элементу ровно 3 раза.
      • -: Соответствует символу дефиса буквально.
      • Таким образом, \\d{3}-\\d{3}-\\d{4} соответствует трем цифрам, за которыми следует дефис, затем еще три цифры, затем дефис и четыре цифры.
    • Pattern pattern = Pattern.compile(regex);: Это компилирует строку регулярного выражения в объект Pattern, который более эффективен для повторного сопоставления.
    • Matcher matcher = pattern.matcher(phoneNumber);: Это создает объект Matcher, который будет выполнять операцию сопоставления на нашей строке phoneNumber с использованием скомпилированного pattern.
    • boolean isMatch = matcher.matches();: Это пытается сопоставить всю входную строку (phoneNumber) с шаблоном. Возвращает true, если вся строка соответствует шаблону, и false в противном случае.
    • Блок if и else просто выводит сообщение в зависимости от того, соответствует ли строка шаблону.
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте программу в терминале:

    javac HelloJava.java

    Если нет ошибок, будет создан файл HelloJava.class.

  5. Запустите скомпилированную программу:

    java HelloJava

    Вы должны увидеть вывод, указывающий, что "123-456-7890" является допустимым форматом телефонного номера в соответствии с нашим простым регулярным выражением.

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

Валидация телефонного номера с использованием Matcher

На предыдущем этапе мы создали простой шаблон регулярного выражения (Regex) и использовали метод matches() класса Matcher для проверки, соответствует ли вся строка шаблону. На этом этапе мы будем более подробно изучать класс Matcher и узнать, как он работает.

Класс Matcher является движком, который выполняет операции сопоставления. Он создается из объекта Pattern и используется для поиска вхождений шаблона в входной строке.

Давайте модифицируем нашу программу, чтобы проверить другую строку и посмотреть, как работает метод matches().

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  2. Измените строку phoneNumber на такую, которая не точно соответствует нашему текущему шаблону \\d{3}-\\d{3}-\\d{4}. Например, измените строку:

    String phoneNumber = "123-456-7890"; // The string to check

    на:

    String phoneNumber = "My phone number is 123-456-7890."; // The string to check
  3. Сохраните файл (Ctrl+S или Cmd+S).

  4. Скомпилируйте модифицированную программу в терминале:

    javac HelloJava.java
  5. Запустите скомпилированную программу:

    java HelloJava

    На этот раз вывод должен быть таким:

    My phone number is 123-456-7890. is not a valid phone number format.

    Почему это произошло? Потому что метод matches() пытается сопоставить всю входную строку с шаблоном. Поскольку наша входная строка содержит больше, чем только шаблон телефонного номера, метод matches() возвращает false.

    Если бы мы хотели узнать, существует ли шаблон где - то в строке, мы бы использовали другой метод, например find(), который мы рассмотрим позже. Пока мы сосредотачиваемся на валидации того, соответствует ли вся строка определенному формату с использованием метода matches().

    Понимание различия между методами matches() и find() является важным при работе с регулярными выражениями в Java. Метод matches() используется для строгой валидации всей строки, в то время как метод find() используется для поиска шаблона в более длинной строке.

На этом этапе вы увидели, как работает метод matches() класса Matcher и поняли, почему важно понимать его поведение при валидации форматов строк.

Обработка различных форматов телефонных номеров

В реальном мире телефонные номера не всегда следуют точному формату XXX-XXX-XXXX. Они могут использовать точки (.), пробелы ( ) или даже скобки (()). На этом этапе мы модифицируем наш шаблон регулярного выражения (Regex), чтобы он мог обрабатывать некоторые из этих вариантов.

Мы познакомимся с несколькими дополнительными концепциями регулярных выражений, чтобы сделать наш шаблон более гибким:

  • ?: Делает предыдущий элемент необязательным (0 или 1 раз).
  • *: Соответствует предыдущему элементу ноль или более раз.
  • +: Соответствует предыдущему элементу один или более раз.
  • []: Определяет набор символов. Соответствует любому одиночному символу внутри скобок.
  • |: Действует как оператор ИЛИ. Соответствует либо шаблону перед |, либо шаблону после него.

Давайте обновим файл HelloJava.java, чтобы использовать более гибкий шаблон регулярного выражения.

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  2. Измените строку regex на следующую:

    String regex = "\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}"; // More flexible regex pattern

    Разберем этот новый шаблон:

    • \\(?: Соответствует необязательной открывающей скобке (. Мы используем \\ для экранирования специального значения ( в регулярных выражениях, а ? делает ее необязательной.
    • \\d{3}: Соответствует ровно трем цифрам.
    • \\)?: Соответствует необязательной закрывающей скобке ).
    • [-.\\s]?: Это набор символов [], который соответствует либо дефису (-), либо точке (.), либо пробельному символу (\\s). Символ ? делает этот разделитель необязательным.
    • \\d{3}: Соответствует ровно трем цифрам.
    • [-.\\s]?: Опять соответствует необязательному дефису, точке или пробельному разделителю.
    • \\d{4}: Соответствует ровно четырем цифрам.

    Этот шаблон теперь может соответствовать формам, таким как 123-456-7890, (123) 456-7890, 123.456.7890, 123 456 7890 и даже 1234567890 (без каких - либо разделителей).

  3. Теперь давайте протестируем этот новый шаблон с разными форматами телефонных номеров. Замените строку phoneNumber на несколько разных примеров:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class HelloJava {
        public static void main(String[] args) {
            String[] phoneNumbers = {
                "123-456-7890",
                "(123) 456-7890",
                "123.456.7890",
                "123 456 7890",
                "1234567890",
                "invalid-number", // This should not match
                "123-456-789" // This should not match
            };
    
            String regex = "\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}"; // More flexible regex pattern
    
            Pattern pattern = Pattern.compile(regex);
    
            for (String phoneNumber : phoneNumbers) {
                Matcher matcher = pattern.matcher(phoneNumber);
                boolean isMatch = matcher.matches();
    
                if (isMatch) {
                    System.out.println(phoneNumber + " is a valid phone number format.");
                } else {
                    System.out.println(phoneNumber + " is not a valid phone number format.");
                }
            }
        }
    }

    Мы ввели массив строк phoneNumbers для удобного тестирования нескольких входных данных и цикл for для перебора их.

  4. Сохраните файл (Ctrl+S или Cmd+S).

  5. Скомпилируйте программу в терминале:

    javac HelloJava.java
  6. Запустите скомпилированную программу:

    java HelloJava

    Вы должны увидеть вывод, похожий на следующий, показывающий, какие строки соответствуют шаблону:

    123-456-7890 is a valid phone number format.
    (123) 456-7890 is a valid phone number format.
    123.456.7890 is a valid phone number format.
    123 456 7890 is a valid phone number format.
    1234567890 is a valid phone number format.
    invalid-number is not a valid phone number format.
    123-456-789 is not a valid phone number format.

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

Резюме

В этом практическом занятии (лабораторной работе) мы научились проверять, соответствует ли строка формату телефонного номера в Java с использованием регулярных выражений (Regex). Мы начали с понимания концепции регулярных выражений и их важности для сопоставления шаблонов, особенно при обработке различных форматов телефонных номеров. Затем мы создали простую Java - программу, используя пакет java.util.regex.

Первый этап заключался в создании базового шаблона регулярного выражения \\d{3}-\\d{3}-\\d{4} для сопоставления формата "XXX-XXX-XXXX". Мы использовали метод Pattern.compile(), чтобы скомпилировать регулярное выражение в объект Pattern, и метод Pattern.matcher(), чтобы создать объект Matcher для входной строки. Наконец, мы использовали метод matcher.matches(), чтобы проверить, соответствует ли вся строка шаблону, и вывели результат. Это заложило основу для валидации телефонных номеров с использованием регулярных выражений в Java.