Какое регулярное выражение будет соответствовать действующим международным телефонным номерам?

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

Какое регулярное выражение будет соответствовать действующим международным телефонным номерам?

Ответ 1

\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$

Правильный формат соответствия общего международного номера телефона. Я заменил международный код доступа к местной телефонной линии 011 США стандартным идентификатором международного кода доступа "+", что делает его обязательным. Я также изменил минимум для национального номера как минимум на одну цифру.

Обратите внимание: если вы вводите цифры в этом формате в свою адресную книгу мобильного телефона, вы можете успешно позвонить по номеру в своей адресной книге независимо от того, где вы путешествуете. Для наземных линий замените "плюс" на международный код доступа для страны, из которой вы набираете номер.

Обратите внимание, что это НЕ принимает во внимание национальные правила тарифного плана - в частности, оно позволяет использовать нули и единицы в местах, где национальные тарифные планы не разрешают, а также допускает число длин, превышающее национальный тарифный план для некоторых стран (например, США).

Ответ 2

Все коды стран определяются МСЭ. Следующее регулярное выражение основано на ITU-T E.164 и Приложение к Оперативному бюллетеню МСЭ № 930 - 15.IV.2009. Он содержит все коды и коды стран, зарезервированные для использования в будущем. Хотя его можно немного сократить, я решил включить каждый код самостоятельно.

Это для звонков, происходящих из США. Для других стран замените международный код доступа (011 в начале регулярного выражения) на все, что подходит для этой страны план набора.

Также обратите внимание, что МСЭ E.164 определяет максимальную длину полного международного телефонного номера до 15 цифр. Это означает, что код из трех цифр страны дает до 12 дополнительных цифр, а код из 1 цифры страны может содержать до 14 дополнительных цифр. Следовательно,

[0-9]{0,14}$

a конец регулярного выражения.

Самое главное, это регулярное выражение не означает, что число действительно - каждая страна определяет свой собственный внутренний план нумерации. Это гарантирует, что код страны действителен.

^ 011 (999 | 998 | 997 | 996 | 995 | 994 | 993 | 992 | 991 | 990 | 979 | 978 | 977 | 976 | 975 | 974 | 973 | 972 | 971 | 970 | 969 | 968 | 967 | 966 | 965 | 964 | 963 | 962 | 961 | 960 | 899 | 898 | 897 | 896 | 895 | 894 | 893 | 892 | 891 | 890 | 889 | 888 | 887 | 886 | 885 | 884 | 883 | 882 | 881 | 880 | 879 | 878 | 877 | 876 | 875 | 874 | 873 | 872 | 871 | 870 | 859 | 858 | 857 | 856 | 855 | 854 | 853 | 852 | 851 | 850 | 839 | 838 | 837 | 836 | 835 | 834 | 833 | 832 | 831 | 830 | 809 | 808 | 807 | 806 | 805 | 804 | 803 | 802 | 801 | 800 | 699 | 698 | 697 | 696 | 695 | 694 | 693 | 692 | 691 | 690 | 689 | 688 | 687 | 686 | 685 | 684 | 683 | 682 | 681 | 680 | 679 | 678 | 677 | 676 | 675 | 674 | 673 | 672 | 671 | 670 | 599 | 598 | 597 | 596 | 595 | 594 | 593 | 592 | 591 | 590 | 509 | 508 | 507 | 506 | 505 | 504 | 503 | 502 | 501 | 500 | 429 | 428 | 427 | 426 | 425 | 424 | 423 | 422 | 421 | 420 | 389 | 388 | 387 | 386 | 385 | 384 | 383 | 382 | 381 | 380 | 379 | 378 | 377 | 376 | 375 | 374 | 373 | 372 | 371 | 370 | 359 | 358 | 357 | 356 | 355 | 354 | 353 | 352 | 351 | 350 | 299 | 298 | 297 | 296 | 295 | 294 | 293 | 292 | 291 | 290 | 289 | 288 | 287 | 286 | 285 | 284 | 283 | 282 | 281 | 280 | 269 | 268 | 267 | 266 | 265 | 264 | 263 | 262 | 261 | 260 | 259 | 258 | 257 | 256 | 255 | 254 | 253 | 252 | 251 | 250 | 249 | 248 | 247 | 246 | 245 | 244 | 243 | 242 | 241 | 240 | 239 | 238 | 237 | 236 | 235 | 234 | 233 | 232 | 231 | 230 | 229 | 228 | 227 | 226 | 225 | 224 | 223 | 222 | 221 | 220 | 219 | 218 | 217 | 216 | 215 | 214 | 213 | 212 | 211 | 210 | 98 | 95 | 94 | 93 | 92 | 91 | 90 | 86 | 84 | 82 | 81 | 66 | 65 | 64 | 63 | 62 | 61 | 60 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1) [0-9] {0, 14} $

Ответ 3

Это еще одна оптимизация.

\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$

(i) позволяет использовать действующие международные префиксы
(ii), за которым следует 9 или 10 цифр, с любым типом или размещением разделителей (кроме двух последних цифр)

Это будет соответствовать:
  + 1-234-567-8901
  + 61-234-567-89-01
  + 46-234 5678901
  +1 (234) 56 89 901
  +1 (234) 56-89 901
  +46.234.567.8901
  +1/234/567/8901

Ответ 4

Вы можете использовать библиотеку libphonenumber от Google.

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String decodedNumber = null;
PhoneNumber number;
    try {
        number = phoneNumberUtil.parse(encodedHeader, null);
        decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164);
    } catch (NumberParseException e) {
        e.printStackTrace();
    }

Ответ 5

Здесь "оптимизированная" версия вашего регулярного выражения:

^011(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$

Вы можете заменить \d на [0-9], если ваш синтаксис regex не поддерживает \d.

Ответ 6

Я использую этот:

/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/

Преимущества: распознает + или 011 начала, позволяет до тех пор, пока это необходимо, и обрабатывает многие соглашения о расширении. (#, Х, доб, расширение)

Ответ 7

Это будет работать для международных номеров;

С#:

@"^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$"

JS:

/^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/

Ответ 8

Для iOS SWIFT Я нашел это полезным,

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"

Ответ 9

Очевидно, существует множество способов сделать это, о чем свидетельствуют все различные ответы, данные до сих пор, но я брошу свою сумму в 0,02 доллара здесь и предоставил регулярное выражение ниже, что немного более кратким, чем почти все выше, но более тщательный, чем большинство. Он также имеет приятный побочный эффект, оставляя код страны в $1 и локальный номер в $2.

^\+ (? =\{D} $5,15) (1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0 -6] | 7 | 8 [1-469] | 9 [0-58] | [2-9]..) (\ d +) $

Ответ 10

Простая версия для европейских номеров, которая соответствует номерам, таким как 0034617393211, но также и длинным, как 004401484172842.

^0{2}[0-9]{11,}

Надеюсь, что это поможет: ·)

Ответ 11

public static boolean validateInternationalPhoneNumberFormat(String phone) {
    StringBuilder sb = new StringBuilder(200);

    // Country code
    sb.append("^(\\+{1}[\\d]{1,3})?");

    // Area code, with or without parentheses
    sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");

    // Phone number separator can be "-", "." or " "

    // Minimum of 5 digits (for fixed line phones in Solomon Islands)
    sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");

    // 4 more optional digits
    sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");

    return Pattern.compile(sb.toString()).matcher(phone).find();
}

Ответ 12

Международный план нумерации основан на плане нумерации ITU E.164. Я предполагаю, что отправная точка вашего регулярного выражения.

Я обновлю это, если мне удастся создать регулярное выражение на основе нумерации ITU E.164.

Ответ 13

Это выражение выражений работает для телефонов Индии, Канады, Европы, Новой Зеландии, Австралии, Соединенных Штатов Америки, а также их кодов стран:

"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"

Ответ 14

Это работает для меня, без префикса 00, 001, 0011 и т.д.

/^\+*(\d{3})*[0-9,\-]{8,}/

Ответ 15

Вот регулярное выражение для следующих наиболее распространенных сценариев телефонного номера. Хотя это с учетом перспективы США для кодов областей, оно работает для международных сценариев.

  • Фактическое число должно быть 10 цифр.
  • Для кода номера США номер может быть окружен круглыми скобками().
  • Код страны может содержать от 1 до 3 цифр. Необязательно может предшествовать знак +.
  • Может быть тире, пробелы, точки или пробелы между кодом страны, кодом города и остальной частью номера.
  • Действительный номер телефона не может быть нулями.

    ^(?!\b(0)\1+\b)(\+?\d{1,3}[. -]?)?\(?\d{3}\)?([. -]?)\d{3}\3\d{4}$
    

Объяснение:

    ^ - start of expression  
    (?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros.  
    (\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.  
    \(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.  
    ([. -]?) - optional space, dash or dot
    $ - end of expression

Дополнительные примеры и объяснения - https://regex101.com/r/hTH8Ct/2/

Ответ 16

Я использовал это ниже:

^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$

Формат + CCC.NNNNNNNNNNxXEEEE или 00CCC.NNNNNNNNNNXEEEE

Номер телефона должен начинаться с "+" или "00" для международного вызова. где C - код страны с 1-3 цифрами,

N - до 14 цифр,

а E - расширение (необязательное).

Значок ведущего плюса и точка, следующая за кодом страны, требуются. Литеральный символ "x" требуется, только если предоставляется расширение.

Ответ 18

Измененное регулярное выражение @Eric - добавлено список всех кодов стран (получено их из xxxdepy @Github, Надеюсь, вам будет полезно:

/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/

Ответ 19

Попробуйте это, я не знаю, есть ли какой-либо номер телефона длиннее 12:

^(00|\+){1}\d{12}$