Que expressão regular irá corresponder aos números de telefone internacionais válidos?

Preciso de determinar se um número de telefone é válido antes de tentar ligar. A chamada pode ir para qualquer lugar do mundo.

que expressão regular irá corresponder aos números de telefone internacionais válidos?

Author: Abtin Forouzandeh, 2010-01-22

20 answers

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

É o formato correcto para corresponder a um número de telefone internacional Genérico. Substituí o código de acesso internacional centralizado da linha terrestre dos EUA 011 pelo identificador padrão do código de acesso internacional de"+", Tornando-o obrigatório. Eu também mudei o mínimo para o número nacional para pelo menos um dígito.

Note que, se introduzir números neste formato na sua agenda de endereços de telemóvel, poderá ligar com sucesso para qualquer número da sua agenda de endereços, independentemente do local onde viaja. Para linhas terrestres, substitua o plus pelo código de acesso internacional para o país de onde você está discando.

Note que isto não leva em conta as regras do Plano Nacional de números - especificamente, permite zeros e uns em locais que os planos nacionais de números podem não permitir e também permite comprimentos de números maiores do que o Plano Nacional de números para alguns países (por exemplo, os EUA).

 71
Author: Eric, 2011-08-06 15:47:34

Todos os códigos de país são definidos pela UIT. O quadro seguinte baseia-se na UIT – T E. 164 e anexo ao boletim Operacional N. º 930-15 da UIT.IV. 2009 . Contém todos os códigos de país e códigos reservados para utilização futura. Embora pudesse ser encurtado um pouco, decidi incluir cada código de forma independente.

Isto é para chamadas provenientes dos EUA. Para os outros países, substituir o código de acesso internacional (o 011 no início da regex) por qualquer outro código. apropriado para o plano de marcação desse país.

Note-se também que a UIT e. 164 define o comprimento máximo de um número de telefone internacional completo a 15 dígitos. Isso significa que um código de país de três dígitos resulta em até 12 dígitos adicionais, e um código de país de um dígito pode conter até 14 dígitos adicionais. Daí o

[0-9]{0,14}$

O fim do vértice.

O mais importante é que esta expressão não significa que o número seja válido-cada país define a sua própria numeração interna plano. Isto só garante que o código do país é válido.

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

 66
Author: Abtin Forouzandeh, 2010-01-21 23:49:05
Isto é mais uma optimização.
\+(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) permite prefixos internacionais válidos
ii) seguido de 9 ou 10 dígitos, com qualquer tipo ou colocação de Delimitadores (excepto entre os dois últimos dígitos)

Isto vai corresponder:
+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

 27
Author: fezfox, 2013-08-03 05:29:40

Pode utilizar a biblioteca do 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();
    }
 17
Author: Paulo Fidalgo, 2013-12-03 11:20:46
Aqui está uma versão "optimizada"do seu regex:
^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}$

Pode substituir os \d s por [0-9] se a sua sintaxe regex não suportar \d.

 10
Author: Laurence Gonsalves, 2010-01-22 01:23:46

Eu uso este:

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

Vantagens: reconhece + ou 011 inícios, permite que seja o tempo necessário, e lida com muitas convenções de extensão. (#, x,extracto,extensão)

 7
Author: TOBlender, 2013-10-25 14:17:45

Isto vai funcionar para números internacionais;

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}$/
 6
Author: MADol, 2013-10-02 09:22:48

Para iOS SWIFT achei isto útil,

let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
 6
Author: Zaid Pathan, 2014-11-25 13:01:33
[[1]há obviamente uma infinidade de maneiras de fazer isso, como evidenciado por todas as diferentes respostas dadas até agora, mas eu vou jogar meu valor de $0,02 aqui e fornecer a regex abaixo, que é um pouco mais conciso do que quase todos OS acima, mas mais completo do que a maioria também. Ele também tem o bom efeito colateral de deixar o código do país em $1 e o número local em $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+)$

 2
Author: trekinaz, 2015-11-19 23:39:43

Modificou a expressão regular do @Eric-adicionou uma lista de todos os códigos de país (obteve-os de xxxdepy @ Github . Espero que o ache útil.

/(\+|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
Author: Dev, 2017-12-23 03:34:11

Uma versão simples para números europeus, que corresponde a números como 0034617393211, mas também longos como 004401484172842.

^0{2}[0-9]{11,}
Espero que ajude.
 1
Author: Roc Boronat, 2015-11-27 11:29:37
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();
}
 1
Author: Cássio, 2016-10-31 17:23:40

O plano internacional de numeração baseia-se no plano de numeração da UIT e. 164 . Acho que esse é o ponto de partida para a tua expressão regular.

Vou actualizar isto se criar uma expressão regular baseada na numeração da UIT e. 164.
 0
Author: Buhake Sindi, 2010-01-22 00:28:45

Esta expressão Regex funciona para a Índia, Canadá, Europa, Nova Zelândia, Austrália, números de telefone dos Estados Unidos, juntamente com os seus códigos de país:

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

 0
Author: Harsha Garg, 2016-06-07 11:02:47

Isto funciona para mim, sem o 00, 001, 0011 etc prefixo embora:

/^\+*(\d{3})*[0-9,\-]{8,}/
 0
Author: redwud, 2017-03-25 05:15:50

Aqui está um regex para os seguintes cenários de números de telefone mais comuns. Embora isto seja adaptado a partir de uma perspectiva dos EUA para códigos de área, ele funciona para cenários internacionais.

  1. O número actual deve ser apenas de 10 dígitos.
  2. para os números dos EUA, o código de área pode estar rodeado de parênteses ().
  3. o código do país pode ter 1 a 3 dígitos. A título facultativo, pode ser precedido de um sinal+.
  4. pode haver traços, espaços, pontos ou sem espaços entre o código do país, código da área e o resto do número.
  5. Um número de telefone válido Não pode ser todos os zeros.

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

Explicação:

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

Mais exemplos e explicações - https://regex101.com/r/hTH8Ct/2/

 0
Author: Appy, 2017-07-06 19:39:25

Usei isto abaixo:

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

O formato + CCC.Nnnnnnnnnnnxee ou 00CCC.Nnnnnnnnnxee

O número de telefone deve começar com '+' ou '00' para uma chamada internacional. em que C é o código do País de 1-3 dígitos,

N é até 14 dígitos,

E E é a extensão (opcional).

É necessário o sinal mais inicial e o ponto que segue o código do país. O caráter literal "x" só é necessário se for fornecida uma extensão.

 0
Author: Md. Rousonur Jaman, 2017-08-18 10:22:45
Mesmo que isto não esteja a usar a RegExp para fazer o trabalho - ou talvez por causa disso -, parece-me uma boa solução: https://intl-tel-input.com/node_modules/intl-tel-input/examples/gen/is-valid-number.html
 0
Author: Tony Vlcek, 2017-10-14 16:40:45

Tenta a seguinte API para validação do número de telefone. Também isto irá devolver o país, a área e o fornecedor

Demo https://libphonenumber.appspot.com/

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

 0
Author: Gagan Ahuja, 2018-03-05 09:01:07

Tenta isto, não sei se há algum Número de telefone maior que 12:

^(00|\+){1}\d{12}$
 -2
Author: MKYuones, 2016-09-25 23:23:57