Подтвердить что ты не робот

Регулярное выражение, соответствующее форматированным телефонным номерам E.164

Мне нужно добавить регулярное выражение, которое соответствует всем возможным действительным телефонным номерам в формате E.164.

Это регулярное выражение прекрасно работает для телефонных номеров в Северной Америке, но мне нужно кое-что, что будет работать и для международных номеров:

^(+1|1)?([2-9]\d\d[2-9]\d{6})$

Пример: +13172222222 соответствует          13172222222 все еще совпадает, потому что +1 или 1 являются дополнительными          3172222222 все еще совпадает, потому что +1 или 1 являются необязательными          3171222222 не соответствует и не является действительным номером NANPA.

Источник: Freeswitch.org

Я также сталкивался с этим смежным вопросом, но думаю, что он слишком сумасшедший для моих нужд. В моем случае я просто проверяю запись в черном списке, который сравниваю с входящими данными Twilio; так что меня больше волнует погода, код страны действителен. Мне действительно нужно только проверить, соответствует ли число общей E.164 форме, а не предполагать, что это NANPA.

Чтобы лучше понять, что мне нужно, вот пример из документации Twilio:

Все номера телефонов в запросах от Twilio в формате E.164, если возможно. Например, (415) 555-4345 будет проходить как "+1 4155554345". Однако иногда случаются случаи где Twilio не может нормализовать Идентификатор входящего звонка на E.164. В этих ситуации Twilio будет сообщать в сыром строка идентификатора вызывающего абонента.

Я хочу сопоставить что-то вроде +1 4155554345, но не (415) 555-4345, 415555434, 555-4345 или 5554345. Регулярное выражение не должно ограничиваться совпадением только с кодом страны США. По сути, он должен соответствовать формату +xxxxxxxxxxx. Я также думаю, что номер может быть длиннее, так как есть многозначные коды стран, например, в Великобритании. Номер T-Mobile в Великобритании - +447953966150. Я обновлю его, если смогу найти лучший пример.

4b9b3361

Ответ 1

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

Он должен быть ^\+?[1-9]\d{1,14}$.

См. http://en.wikipedia.org/wiki/E.164

Ответ 2

Я думаю, до тех пор, пока у вас не будет большого набора примеров, вам лучше всего воспользоваться гибким регулярным выражением. Это будет соответствовать +, а затем 10-14 цифр.

^\+?\d{10,14}$

Разбитое, это выражение означает: ^ Сопоставьте начало строки. \+? Опционально соответствует символу +. \d{10,14} Сопоставьте между 10 и 14 цифрами. $ Убедитесь, что мы находимся в конце строки.

Если вы узнаете, что цифра с определенным индексом не должна быть 1 или 0, вы можете использовать [2-9] в этой позиции, например:

^\+?\d{6,7}[2-9]\d{3}$

[2-9] означает соответствие любой цифры от 2 до 9 (не соответствуют 0 или 1.)

Ответ 3

Это соответствует только форматам, таким как +16174552211 и 16174552211

/\A\+?\d{11}\z/

Это особенно полезно, если вы используете Twilio и Ruby on Rails

Ответ 4

Хорошо, я использовал принятый ответ, но он не удался для многих случаев:

Для таких входов, как:

  • Если числа не начинались с "+".
  • Где количество номеров меньше 9.

не удалось выполнить регулярное выражение.

Наконец я использовал

^\+(?:[0-9]?){6,14}[0-9]$

Это работало как прелесть!

Ответ 5

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

/^(\+1|1)?[2-9]\d\d[2-9]\d{6}$/g

Посмотрите, как работает http://refiddle.com/19x

Ответ 6

Принятый ответ не работает с числами без знака "+". И я немного подсчитал, следуя метрикам Википедии, Код страны: от 1 до 3 цифр,
максимум: 15, Фактический номер телефона: от 12 (после 15-3) до 14 (15-1) цифр

Минимум в этом отношении равен 10. Например, фиктивный номер США "+14155552671" является абсолютным минимумом. Если разбить его, +1 - это код страны США, а все остальное - "Код города" + "Номер абонента", который будет равен 10. Я не смог найти в своем исследовании число менее 7 цифр (Швеция ) и действует.

Таким образом, регулярное выражение, которое мне пришлось придумать, которое работает вместе со знаком "+" вместе с цифрами, которые обычно находятся между 10 ~ 15, выглядит следующим образом:

^\++?[1-9][0-9]\d{6,14}$

И это хорошо работает. Вы можете проверить это на Regex101.

Ответ 7

Этот RegEx ^\\+?[0-9]{1,3}[ 1-9]\\d{1,14}$ также работает без недопустимого регулярного выражения.

Ответ 8

изменение принятого ответа только для соответствия номеру телефона с использованием знака плюс

^ ++? [1-9]\d {1,14} $

это гарантирует, что номер телефона имеет знак плюса, такой как +1234567890