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

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

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

20 ответов


\+(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.ИЖ.2009. Он содержит все текущие коды стран и коды, зарезервированные для будущего использования. Хотя он может быть немного сокращен, я решил включить каждый код независимо.

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

также обратите внимание, что МСЭ E. 164 определяет максимальную длину полного международного телефонного номера до 15 цифр. Это означает, что трехзначный код страны может содержать до 12 дополнительных цифр, а однозначный код страны может содержать до 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] Если синтаксис регулярных выражений не поддерживает \d.


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

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

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


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

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

на 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+)$


изменено регулярное выражение @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}$/

простая версия для европейских номеров, которая соответствует номерам, таким как 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();
}

международный план нумерации основан на МСЭ Е. 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,}/

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

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

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

объяснение:

    ^ - start of expression  
    (?!\b(0)+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character.  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.Nnnnnnnnnnnxeeeeee или 00CCC.NNNNNNNNNNxEEEE

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

N до 14 цифр,

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

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


хотя это на самом деле не использует RegExp для выполнения работы - или, может быть, из - за этого-это выглядит как хорошее решение для меня: https://intl-tel-input.com/node_modules/intl-tel-input/examples/gen/is-valid-number.html


попробуйте следующий API для проверки номера телефона. Также это вернет страну, область и провайдера

демо https://libphonenumber.appspot.com/

git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0


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

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