Я бы также посоветовал взглянуть на " libphonenumber " в библиотеке Google. Я знаю, что это не регулярное выражение, но он делает именно то, что вы хотите.
Например, он распознает, что:
15555555555
- возможный номер, но не действительный номер. Он также поддерживает страны за пределами США.
Основные функциональные возможности:
- Разбор / форматирование / проверка телефонных номеров для всех стран / регионов мира.
getNumberType
- получает тип номера на основе самого номера; возможность различать фиксированные, мобильные, бесплатные, премиальные, общие, VoIP и персональные номера (когда это возможно).
isNumberMatch
- получает уровень достоверности того, могут ли два числа совпадать.
getExampleNumber
/ getExampleNumberByType
- предоставляет действительные номера примеров для всех стран / регионов с возможностью указания, какой тип примера номера телефона требуется.
isPossibleNumber
- быстро угадать, является ли номер возможным телефонным номером, используя только информацию о длине, намного быстрее, чем полная проверка.
isValidNumber
- полная проверка номера телефона для региона с использованием информации о длине и префиксе.
AsYouTypeFormatter
- форматирование телефонных номеров на лету, когда пользователи вводят каждую цифру.
findNumbers
- находит цифры при вводе текста.
PhoneNumberOfflineGeocoder
- предоставляет географическую информацию, связанную с номером телефона.
Примеры
Самая большая проблема с проверкой номера телефона - это очень культурная зависимость.
- America
(408) 974–2042
является действительным номером США
(999) 974–2042
является недействительным номер США
- Австралия
0404 999 999
является действительным австралийским номером
(02) 9999 9999
также является действительным австралийским номером
(09) 9999 9999
является недействительным австралийский номер
Регулярное выражение отлично подходит для проверки формата телефонного номера, но на самом деле не удастся проверить достоверность телефонного номера.
Я бы предложил пропустить простое регулярное выражение для проверки вашего телефонного номера и использовать библиотеку, такую как Google libphonenumber
(ссылка на проект GitHub) .
Представляем libphonenumber!
Используя один из ваших более сложных примеров, 1-234-567-8901 x1234
, вы получаете следующие данные из libphonenumber
(ссылка на онлайн-демонстрацию) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Таким образом, вы не только узнаете, является ли номер телефона действительным (каким он является), но также вы получаете согласованное форматирование номера телефона в вашем регионе.
В качестве бонуса, libphonenumber
имеет ряд наборов данных для проверки правильности телефонных номеров, поэтому проверяется такой номер, как +61299999999
(международная версия (02) 9999 9999
). возвращается как действительное число с форматированием:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
libphonenumber также дает вам много дополнительных преимуществ, таких как захват местоположения, в котором обнаружен номер телефона, а также получение информации о часовом поясе с номера телефона:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Но недействительный австралийский номер телефона ((09) 9999 9999
) показывает, что это недопустимый номер телефона.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
В версии Google есть код для Java и Javascript, но люди также внедрили библиотеки для других языков, которые используют набор телефонных номеров Google i18n:
Если вы не уверены, что вы всегда будете принимать числа из одной локали, и они всегда будут в одном формате, я настоятельно рекомендую не писать свой собственный код для этого и использовать libphonenumber для проверки и отображения номера телефонов.