Ответ 1
Принятый ответ хорош, за исключением номера E.164 может иметь до 15 цифр. Спецификация также не указывает на минимум, поэтому я не буду рассчитывать на 10.
Он должен быть ^\+?[1-9]\d{1,14}$
.
Мне нужно добавить регулярное выражение, которое соответствует всем возможным действительным телефонным номерам в формате 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. Я обновлю его, если смогу найти лучший пример.
Принятый ответ хорош, за исключением номера E.164 может иметь до 15 цифр. Спецификация также не указывает на минимум, поэтому я не буду рассчитывать на 10.
Он должен быть ^\+?[1-9]\d{1,14}$
.
Я думаю, до тех пор, пока у вас не будет большого набора примеров, вам лучше всего воспользоваться гибким регулярным выражением. Это будет соответствовать +
, а затем 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.)
Это соответствует только форматам, таким как +16174552211
и 16174552211
/\A\+?\d{11}\z/
Это особенно полезно, если вы используете Twilio и Ruby on Rails
Хорошо, я использовал принятый ответ, но он не удался для многих случаев:
Для таких входов, как:
не удалось выполнить регулярное выражение.
Наконец я использовал
^\+(?:[0-9]?){6,14}[0-9]$
Это работало как прелесть!
Регулярное выражение, которое вы предоставили, должно работать, за исключением того, что нужно выполнить инициализацию +
.
/^(\+1|1)?[2-9]\d\d[2-9]\d{6}$/g
Посмотрите, как работает http://refiddle.com/19x
Принятый ответ не работает с числами без знака "+". И я немного подсчитал, следуя метрикам Википедии,
Код страны: от 1 до 3 цифр,
максимум: 15,
Фактический номер телефона: от 12 (после 15-3) до 14 (15-1) цифр
Минимум в этом отношении равен 10. Например, фиктивный номер США "+14155552671" является абсолютным минимумом. Если разбить его, +1 - это код страны США, а все остальное - "Код города" + "Номер абонента", который будет равен 10. Я не смог найти в своем исследовании число менее 7 цифр (Швеция ) и действует.
Таким образом, регулярное выражение, которое мне пришлось придумать, которое работает вместе со знаком "+" вместе с цифрами, которые обычно находятся между 10 ~ 15, выглядит следующим образом:
^\++?[1-9][0-9]\d{6,14}$
И это хорошо работает. Вы можете проверить это на Regex101.
Этот RegEx ^\\+?[0-9]{1,3}[ 1-9]\\d{1,14}$
также работает без недопустимого регулярного выражения.
изменение принятого ответа только для соответствия номеру телефона с использованием знака плюс
^ ++? [1-9]\d {1,14} $
это гарантирует, что номер телефона имеет знак плюса, такой как +1234567890