Я бы также посоветовал взглянуть на библиотеку Google " libphonenumber ". Я знаю, что это не регулярное выражение, но он делает именно то, что вы хотите.
Например, он признает, что:
15555555555
это возможный номер, но не действительный номер. Он также поддерживает страны за пределами США.
Основные функциональные возможности:
- Разбор / форматирование / проверка телефонных номеров для всех стран / регионов мира.
getNumberType
- получает тип номера на основе самого номера; возможность различать фиксированные, мобильные, бесплатные, премиальные, общие, VoIP и персональные номера (когда это возможно).
isNumberMatch
- получает уровень достоверности того, могут ли два числа быть одинаковыми.
getExampleNumber
/ getExampleNumberByType
- предоставляет действительные примеры номеров для всех стран / регионов, с возможностью указать, какой тип примера номера телефона требуется.
isPossibleNumber
- быстро угадать, является ли номер возможным телефонным номером, используя только информацию о длине, намного быстрее, чем полная проверка.
isValidNumber
- полная проверка номера телефона для региона с использованием длины и префикса информации.
AsYouTypeFormatter
- форматирование телефонных номеров на лету, когда пользователи вводят каждую цифру.
findNumbers
- находит числа при вводе текста.
PhoneNumberOfflineGeocoder
- предоставляет географическую информацию, связанную с номером телефона.
Примеры
Самая большая проблема с проверкой номера телефона - это очень культурная зависимость.
- Америка
(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 для проверки и отображения телефонных номеров.