Другое

Полное руководство по шаблонам регулярных выражений для телефонных номеров

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

Как создать комплексный шаблон регулярного выражения для валидации телефонных номеров?

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

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

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

Создание комплексного шаблона регулярного выражения для валидации телефонных номеров

Создание комплексного шаблона регулярного выражения для валидации телефонных номеров требует баланса между строгой валидацией и гибкостью для адаптации к различным международным форматам. Хотя не существует единого идеального регулярного выражения, которое обрабатывало бы все форматы телефонных номеров во всем мире из-за разнообразных национальных конвенций, мы можем разработать надежные шаблоны, которые охватывают американские номера и многие международные форматы на основе установленных стандартов, таких как ITU-T E.164.

Содержание


Понимание проблем валидации телефонных номеров

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

  • Длине (от 7 до 15 цифр)
  • Формату номеров (скобки, тире, точки, пробелы)
  • Конвенциям кодов стран
  • Форматам добавочных номеров
  • Локальным правилам нумерации

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


Комплексные шаблоны регулярных выражений для американских телефонных номеров

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

Шаблон для гибких американских телефонных номеров

Этот шаблон обрабатывает все упомянутые вами форматы:

regex
^(?:(?:\+?1\s?)?(?:\(?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{4}(?:\s?(?:ext|x|\.?)\s?\d{1,5})?)$

Разбор:

  • ^ - Начало строки
  • (?:\+?1\s?)? - Необязательный код страны США с необязательным пробелом
  • (?:\(?\d{3}\)?[\s.-]?)? - Необязательный код зоны в скобках или с разделителем
  • \d{3}[\s.-]?\d{4} - Основной телефонный номер с необязательными разделителями
  • (?:\s?(?:ext|x|\.?)\s?\d{1,5})? - Необязательный добавочный номер в различных форматах
  • $ - Конец строки

Альтернативный шаблон для строгой американской валидации

Для более строгой валидации, соответствующей конвенциям плана нумерации Северной Америки:

regex
^(?:\+?1[-.\s]?)?\(?(\d{3})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})(?:\s?(?:ext|x|\.?)\s?(\d{1,5}))?$

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

Тестирование ваших конкретных форматов

Все упомянутые вами форматы будут соответствовать этим шаблонам:

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

Международная валидация телефонных номеров

Для международной поддержки мы можем опираться на рекомендации стандарта ITU-T E.164. Согласно Книге рецептов регулярных выражений O’Reilly, международные телефонные номера должны начинаться со знака плюс, за которым следует код страны.

Комплексный международный шаблон

regex
^(?:\+?(\d{1,3})[-.\s]?)?\(?(\d{3})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})(?:\s?(?:ext|x|\.?)\s?(\d{1,5}))?$

Более гибкий международный шаблон

regex
^[+]{1}(?:[0-9\-\\(\\)\\/\x20\\.\s]){6,15}[0-9]{1}$

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

Особенности, специфичные для стран

Разные страны имеют разные конвенции:

  • США/Канада: 10 цифр с необязательным кодом страны +1
  • Великобритания: Обычно начинается с 0 или +44
  • Европейские страны: Различная длина, часто с кодами стран
  • Мобильные номера: Могут иметь другие шаблоны, чем стационарные

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


Лучшие практики для валидации телефонных номеров

1. Баланс между строгостью и гибкостью

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

2. Нормализация перед валидацией

Рассмотрите возможность нормализации телефонных номеров перед валидацией:

  • Удалите все нецифровые символы, кроме + и x
  • Проверьте получившуюся цифровую последовательность
  • При необходимости переформатируйте

Пример подхода к нормализации:

python
import re

def normalize_phone(phone):
    # Удаляем все, кроме цифр, + и x
    digits = re.sub(r'[^\d+x]', '', phone)
    return digits

3. Учитывайте ограничения по длине

Международные телефонные номера обычно варьируются от 7 до 15 цифр, исключая коды стран и добавочные номера. Ваше регулярное выражение должно учитывать эти разумные ограничения по длине.

4. Правильно обрабатывайте добавочные номера

Добавочные номера телефонных номеров появляются в различных форматах:

  • x1234
  • ext 1234
  • ext.1234
  • 1234

Ваше регулярное выражение должно допускать эти вариации, при этом гарантируя, что добавочный номер имеет разумную длину (обычно 1-5 цифр).


Примеры реализации

Реализация на JavaScript

javascript
function isValidPhoneNumber(phone) {
    const regex = /^(?:(?:\+?1\s?)?(?:\(?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{4}(?:\s?(?:ext|x|\.?)\s?\d{1,5})?)$/;
    return regex.test(phone);
}

// Тестовые случаи
console.log(isValidPhoneNumber("1-234-567-8901"));      // true
console.log(isValidPhoneNumber("1-234-567-8901 x1234")); // true
console.log(isValidPhoneNumber("1 (234) 567-8901"));    // true
console.log(isValidPhoneNumber("12345678901"));         // true
console.log(isValidPhoneNumber("invalid"));             // false

Реализация на Python

python
import re

def validate_phone_number(phone):
    pattern = r'^(?:(?:\+?1\s?)?(?:\(?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{4}(?:\s?(?:ext|x|\.?)\s?\d{1,5})?)$'
    return bool(re.match(pattern, phone))

# Тестовые случаи
test_numbers = [
    "1-234-567-8901",
    "1-234-567-8901 x1234", 
    "1-234-567-8901 ext1234",
    "1 (234) 567-8901",
    "1.234.567.8901",
    "1/234/567/8901",
    "12345678901",
    "invalid"
]

for number in test_numbers:
    print(f"{number}: {validate_phone_number(number)}")

Международная валидация телефонных номеров

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

javascript
function validateInternationalPhone(phone) {
    // Базовая валидация международного формата
    const internationalRegex = /^[+]{1}(?:[0-9\-\\(\\)\\/\x20\\.\s]){6,15}[0-9]{1}$/;
    
    // Специфическая валидация формата США
    const usRegex = /^(?:(?:\+?1\s?)?(?:\(?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{4}(?:\s?(?:ext|x|\.?)\s?\d{1,5})?)$/;
    
    return internationalRegex.test(phone) || usRegex.test(phone);
}

Продвинутые техники валидации

1. Постепенная валидация

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

javascript
function progressiveValidation(phone) {
    // Шаг 1: Базовая проверка формата
    const basicRegex = /^[\d\s\-\(\)\+\.xext]+$/i;
    if (!basicRegex.test(phone)) return false;
    
    // Шаг 2: Извлечение цифр для проверки длины
    const digits = phone.replace(/\D/g, '');
    if (digits.length < 7 || digits.length > 15) return false;
    
    // Шаг 3: Специфическая валидация формата
    const formatRegex = /^(?:(?:\+?1\s?)?(?:\(?\d{3}\)?[\s.-]?)?\d{3}[\s.-]?\d{4}(?:\s?(?:ext|x|\.?)\s?\d{1,5})?)$/;
    return formatRegex.test(phone);
}

2. Библиотека для валидации, специфичной для страны

Для производственных систем рассмотрите возможность использования специализированных библиотек, таких как:

  • libphonenumber (библиотека Google для телефонных номеров)
  • phonenumbers (порт библиотеки Google на Python)
  • google-libphonenumber (JavaScript)

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

3. Валидация в реальном времени с форматированием

Реализуйте валидацию, которая также форматирует телефонный номер по мере ввода пользователем:

javascript
function formatPhoneNumber(input) {
    // Удаляем все нецифровые символы
    const cleaned = input.replace(/\D/g, '');
    
    // Форматируем в зависимости от длины
    let formatted = cleaned;
    if (cleaned.length > 0 && cleaned.length <= 3) {
        formatted = cleaned;
    } else if (cleaned.length <= 6) {
        formatted = `(${cleaned.slice(0, 3)}) ${cleaned.slice(3)}`;
    } else if (cleaned.length <= 10) {
        formatted = `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6, 10)}`;
    } else {
        // Обработка добавочных номеров
        const main = cleaned.slice(0, 10);
        const extension = cleaned.slice(10);
        formatted = `(${main.slice(0, 3)}) ${main.slice(3, 6)}-${main.slice(6, 10)}`;
        if (extension) {
            formatted += ` ext ${extension}`;
        }
    }
    
    return formatted;
}

Источники

  1. Validate Phone Numbers ( with Country Code extension) using Regular Expression - GeeksforGeeks
  2. Regular Expressions Cookbook - Validate International Phone Numbers
  3. Validate and Format North American Phone Numbers - Regular Expressions Cookbook
  4. Mastering Phone Number Regex for Efficient Validation - AbstractAPI
  5. The Ultimate Guide to Using Regex for Phone Numbers - FormulasHQ
  6. How to validate phone numbers using regex - Stack Overflow
  7. Regex for North American Phone Number Validation - HowToDoInJava

Заключение

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

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

  2. Рассмотрите постепенные техники валидации, которые сочетают базовую проверку формата с более сложными правилами.

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

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

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

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

Авторы
Проверено модерацией
Модерация