Какое регулярное выражение будет соответствовать действительным международным телефонным номерам? - PullRequest
92 голосов
/ 22 января 2010

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

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

Ответы [ 21 ]

78 голосов
/ 06 августа 2011
\+(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 на стандартный идентификатор международного кода доступа «+», сделав его обязательным. Я также изменил минимальное значение для национального номера как минимум на одну цифру.

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

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

65 голосов
/ 22 января 2010

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

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

.

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

[0-9]{0,14}$

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

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

^ 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} $

29 голосов
/ 03 августа 2013

Это дальнейшая оптимизация.

\+(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

20 голосов
/ 03 декабря 2013

Вы можете использовать библиотеку 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();
    }
11 голосов
/ 25 октября 2013

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

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

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

9 голосов
/ 02 октября 2013

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

C #:

@"^((\+\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}$/
9 голосов
/ 22 января 2010

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

^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 s на [0-9], если ваш синтаксис регулярных выражений не поддерживает \d.

7 голосов
/ 25 ноября 2014

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

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
4 голосов
/ 23 декабря 2017

Изменено регулярное выражение @ Эрика - добавлен список всех кодов стран (получил их от 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}$/
2 голосов
/ 20 ноября 2015

Очевидно, что существует множество способов сделать это, о чем свидетельствуют все различные ответы, которые были даны до сих пор, но я добавлю сюда свою сумму в $ 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 +) $

...