Мне нужно определить, действительно ли номер телефона действителен, прежде чем пытаться набрать его. Телефон может звонить в любую точку мира.
Какое регулярное выражение будет соответствовать действующим международным телефонным номерам?
Мне нужно определить, действительно ли номер телефона действителен, прежде чем пытаться набрать его. Телефон может звонить в любую точку мира.
Какое регулярное выражение будет соответствовать действующим международным телефонным номерам?
\+(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 США стандартным идентификатором международного кода доступа "+", что делает его обязательным. Я также изменил минимум для национального номера как минимум на одну цифру.
Обратите внимание: если вы вводите цифры в этом формате в свою адресную книгу мобильного телефона, вы можете успешно позвонить по номеру в своей адресной книге независимо от того, где вы путешествуете. Для наземных линий замените "плюс" на международный код доступа для страны, из которой вы набираете номер.
Обратите внимание, что это НЕ принимает во внимание национальные правила тарифного плана - в частности, оно позволяет использовать нули и единицы в местах, где национальные тарифные планы не разрешают, а также допускает число длин, превышающее национальный тарифный план для некоторых стран (например, США).
Все коды стран определяются МСЭ. Следующее регулярное выражение основано на 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} $
Это еще одна оптимизация.
\+(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
Вы можете использовать библиотеку 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();
}
Здесь "оптимизированная" версия вашего регулярного выражения:
^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
.
Я использую этот:
/([0-9\s\-]{7,})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/
Преимущества: распознает + или 011 начала, позволяет до тех пор, пока это необходимо, и обрабатывает многие соглашения о расширении. (#, Х, доб, расширение)
Это будет работать для международных номеров;
С#:
@"^((\+\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}$/
Для iOS SWIFT Я нашел это полезным,
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
Очевидно, существует множество способов сделать это, о чем свидетельствуют все различные ответы, данные до сих пор, но я брошу свою сумму в 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 +) $
Простая версия для европейских номеров, которая соответствует номерам, таким как 0034617393211, но также и длинным, как 004401484172842.
^0{2}[0-9]{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();
}
Международный план нумерации основан на плане нумерации ITU E.164. Я предполагаю, что отправная точка вашего регулярного выражения.
Я обновлю это, если мне удастся создать регулярное выражение на основе нумерации ITU E.164.
Это выражение выражений работает для телефонов Индии, Канады, Европы, Новой Зеландии, Австралии, Соединенных Штатов Америки, а также их кодов стран:
"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"
Это работает для меня, без префикса 00, 001, 0011 и т.д.
/^\+*(\d{3})*[0-9,\-]{8,}/
Вот регулярное выражение для следующих наиболее распространенных сценариев телефонного номера. Хотя это с учетом перспективы США для кодов областей, оно работает для международных сценариев.
Действительный номер телефона не может быть нулями.
^(?!\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/
Я использовал это ниже:
^(\+|00)[0-9]{1,3}[0-9]{4,14}(?:x.+)?$
Формат + CCC.NNNNNNNNNNxXEEEE или 00CCC.NNNNNNNNNNXEEEE
Номер телефона должен начинаться с "+" или "00" для международного вызова. где C - код страны с 1-3 цифрами,
N - до 14 цифр,
а E - расширение (необязательное).
Значок ведущего плюса и точка, следующая за кодом страны, требуются. Литеральный символ "x" требуется, только если предоставляется расширение.
Несмотря на то, что RegExp на самом деле не использует RegExp для выполнения задания - или, может быть, из-за этого - это выглядит как приятное решение для меня: https://intl-tel-input.com/node_modules/intl-tel-input/examples/gen/is-valid-number.html
Измененное регулярное выражение @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}$/
Попробуйте это, я не знаю, есть ли какой-либо номер телефона длиннее 12:
^(00|\+){1}\d{12}$