Рубрики
Без рубрики

Проверка Телефонных Номеров С Помощью Регулярного Выражения Java

Узнайте, как проверить различные форматы телефонных номеров с помощью регулярных выражений.

Автор оригинала: baeldung.

1. Обзор

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

2. Регулярные выражения для проверки телефонных номеров

2.1. Десятизначное число

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

@Test
public void whenMatchesTenDigitsNumber_thenCorrect() {
    Pattern pattern = Pattern.compile("^\\d{10}$");
    Matcher matcher = pattern.matcher("2055550125");
    assertTrue(matcher.matches());
}

Это выражение позволит использовать такие числа, как 2055550125 .

2.2. Число С пробелами, Точками или Дефисами

Во втором примере давайте посмотрим, как мы можем разрешить необязательные пробелы, точки или дефисы (-) между числами:

@Test
public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() {
    Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$");
    Matcher matcher = pattern.matcher("202 555 0125");
    assertTrue(matcher.matches());
}

Чтобы достичь этой дополнительной цели (необязательный пробел или дефис), мы просто добавили символы:

  • [- .]?

Этот шаблон позволит использовать такие числа, как 2055550125 , 202 555 0125 , 202.555.0125 , и 202-555-0125 .

2.3. Число В Круглых Скобках

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

@Test
public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() {
    Pattern pattern = Pattern.compile"^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
    Matcher matcher = pattern.matcher("(202) 555-0125");
    assertTrue(matcher.matches());
}

Чтобы разрешить необязательную скобку в числе, мы добавили следующие символы в наше регулярное выражение:

  • (\\(\\d{3}\\))|\\d{3})

Это выражение позволит использовать такие числа, как (202)5550125 , (202) 555-0125 или (202)-555-0125 . Кроме того, это выражение также позволит использовать телефонные номера, описанные в предыдущем примере.

2.4. Номер С Международным Префиксом

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

@Test
public void whenMatchesTenDigitsNumberPrefix_thenCorrect() {
  Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$");
  Matcher matcher = pattern.matcher("+111 (202) 555-0125");
  
  assertTrue(matcher.matches());
}

Чтобы разрешить префикс в нашем номере, мы добавили в начало нашего шаблона символы:

  • (\\+\\d{1,3}( )?)?

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

3. Применение Нескольких Регулярных Выражений

Как мы уже видели, действительный номер телефона может принимать несколько различных форматов. Поэтому мы можем захотеть проверить, соответствует ли наша строка | любому из этих форматов.

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

Если мы не можем создать общее регулярное выражение, которое может проверить все возможные случаи, которые мы хотим охватить, мы можем определить различные выражения для каждого из случаев, а затем использовать их все вместе, объединив их с символом канала (|).

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

  • Выражение, используемое в последнем разделе:
    • ^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$
  • Регулярное выражение, позволяющее использовать такие числа, как +111 123 456 789:

    • ^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$
  • Шаблон, позволяющий использовать такие числа, как +111 123 45 67 89:

    • ^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$
@Test
public void whenMatchesPhoneNumber_thenCorrect() {
    String patterns 
      = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$" 
      + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" 
      + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$";

    String[] validPhoneNumbers 
      = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", 
      "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"};

    Pattern pattern = Pattern.compile(patterns);
    for(String phoneNumber : validPhoneNumbers) {
        Matcher matcher = pattern.matcher(phoneNumber);
        assertTrue(matcher.matches());
    }
}

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

4. Заключение

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

Как всегда, полный исходный код статьи доступен на GitHub .