Фильтрация номеров телефонов

Фильтрация номеров телефонов с помощью регулярных выражений (regex)

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

1. Основные форматы номеров

Перед началом работы необходимо определить, с какими форматами номеров вам придется работать:

  • Международный формат: +7 (8) xxxx xxx xx xx
  • Стандартный российский формат: 8 (495) xxx-xx-xx или 7 (495) xxx-xx-xx
  • Стиль "с разделителями": (495) xxx-xx-xx
  • Без пробелов и скобок: 84951234567

2. Основные шаги при фильтрации номеров

Шаг 1: Определение основных элементов

  • Плюс в начале (опционально): \+?
  • Код страны: \d{1,4}
  • Круглые скобки и пробелы:
    • \s?\(?\d{3}\)? для первой тройки цифр
    • \s?\(?\d{2}\)? или \s?\(?\d{1}\)? для других частей (если у номера разный формат)
  • Номер без разделителей: \d{6,9}

Шаг 2: Создание регулярного выражения

/^\+?\s?7\s?\(?\d{1,3}\)?[\s.-]?\d{3}[\s.-]?\d{2,4}[\s.-]?\d{2,4}$/

Пример использования в Python:


def is_valid_phone(phone):
  pattern = re.compile(r'/^\+?\s?7\s?\(?\d{1,3}\)?[\s.-]?\d{3}[\s.-]?\d{2,4}[\s.-]?\d{2,4}$/')
  return bool(pattern.match(phone))

phones = ['+7 (8) 495 123 456', '8 (495) 123-45-67', '7 (495) 123456']
for phone in phones:
  print(f'{phone} -> {is_valid_phone(phone)}')
    

Пример использования в JavaScript:


function isValidPhone(phone) {
  const pattern = /^\+?\s?7\s?\(?\d{1,3}\)?[\s.-]?\d{3}[\s.-]?\d{2,4}[\s.-]?\d{2,4}$/;
  return pattern.test(phone);
}

const phones = ['+7 (8) 495 123 456', '8 (495) 123-45-67', '7 (495) 123456'];
phones.forEach(phone => console.log(`${phone} -> ${isValidPhone(phone)}`));
    

4. Проверка на уникальность

Для проверки, что номера не дублируются в списке:

Python:


def is_unique_phone(phones):
  return len(set(re.sub(r'\D', '', phone) for phone in phones)) == len(phones)
    

JavaScript:


function areUniquePhones(phones) {
  const normalized = phones.map(phone => phone.replace(/\D/g, ''));
  return new Set(normalized).size === normalized.length;
}
    

Заключение

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