Como qualquer regex lida com erros como números fora de serviço? Apenas tente ligar e lidar com o número inválido como faria com outros erros.
3
Embora você esteja certo de que a regex não pode determinar isso, cada tentativa de saída consome tempo e recursos. Fazer uma rápida verificação de integridade do número garante que uma chamada obviamente falsa não bloqueie um canal valioso.
Abtin Forouzandeh
1
LOL @ paxdiablo .... Acho que 1-800-CALL-HELP vai passar no seu teste RegExp ... lol
Buhake Sindi
1
Algo que não está claro nesta questão é se os números têm que ser válidos se chamados dos EUA ou de qualquer país do mundo, porque a maioria das soluções abaixo não validam alguns números válidos (como 0030 210 12312312 - um válido
Telefone
1
@JonHanna Concordo em um ponto, mas por outro lado, da perspectiva de UX, você não acha que se um usuário inserir um número 00XX ... X, o teste deve passar? Há casos em que os usuários (ou seja, pessoas mais velhas) nem sabem o que é o + e como digitá-lo em um teclado numérico / de telefone. Além disso, eu ainda poderia argumentar que 00XXX é um número internacional válido (ou seja, no contexto de um usuário) onde, em vez de +, o código de saída foi usado.
É o formato correto para corresponder a um número de telefone internacional genérico. Substituí o código de acesso internacional centrado em linha fixa dos EUA 011 pelo identificador de código de acesso internacional padrão '+', tornando-o obrigatório. Também alterei o mínimo do número nacional para pelo menos um dígito.
Observe que se você inserir números neste formato na agenda do seu celular, poderá ligar para qualquer número da agenda, não importa para onde vá. Para linhas fixas, substitua o sinal de mais pelo código de acesso internacional do país de onde você está discando.
Observe que isso NÃO leva em consideração as regras do plano de numeração nacional - especificamente, permite zeros e uns em locais que os planos de numeração nacionais podem não permitir e também permite comprimentos de número maiores do que o plano de numeração nacional para alguns países (por exemplo, os EUA).
Isso não é válido. Os números de telefone europeus podem começar com um duplo 0 sem um + no início. Assim, um número de telefone como: +44 8984 1234 (Reino Unido) também é perfeitamente válido se escrito 0044 8984 1234, que este regexp (e também em outras respostas) não suporta.
Xeroxoid
4
Combinado com as melhorias de @ fezfox (?) E comprimento otimizado:^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
SamWhan
1
+1. Do ponto de vista da UX, sim, pode fazer sentido permitir 00na frente. Do ponto de vista de desenvolvimento e manutenção, eu diria que é perfeitamente normal forçar todos os números para começar +ou até mesmo substituir 00um +cada vez que você o obtiver - especialmente porque a maioria das pessoas está ciente do +formato (que a maioria dos campos internacionais de entrada de telefone exigir de qualquer maneira). Além disso, é uma correção de uma linha e muito mais legível. Essa abordagem também garantiria que todos os números de telefone estivessem no mesmo formato e tornaria sua validação muito menos sujeita a erros, tornando tudo mais fácil de manter.
milosmns
1
E também, nos "velhos" dias do SMS pré-EDGE (GSM simples), usar 00não enviava a mensagem corretamente, ao passo que começar com a +sempre funcionaria internacionalmente. Podemos enlouquecer e torná-lo super complexo, mas às vezes é possível / vale a pena abandonar algumas restrições para tornar nossas vidas mais fáceis :)
milosmns
66
Todos os códigos de país são definidos pela ITU. O seguinte regex é baseado no ITU-T E.164 e no Anexo do Boletim Operacional ITU No. 930 - 15.IV.2009 . Ele contém todos os códigos de país atuais e códigos reservados para uso futuro. Embora pudesse ser um pouco abreviado, decidi incluir cada código de forma independente.
Isso é para chamadas originadas dos EUA. Para outros países, substitua o código de acesso internacional (o 011 no início da regex) pelo que for apropriado para o plano de discagem daquele país .
Além disso, observe que o ITU E.164 define o comprimento máximo de um número de telefone internacional completo para 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 1 dígito pode conter até 14 dígitos adicionais. Daí o
[0-9]{0,14}$
ao final da regex.
Mais importante ainda, esta regex não significa que o número é válido - cada país define seu próprio plano de numeração interno. Isso apenas garante que o código do país seja válido.
Quase acertou ... "011" não faz parte de um código internacional. É exatamente o que as pessoas nos EUA precisam discar para fazer uma chamada internacional. Esse prefixo mudará dependendo de onde você discar ... Portanto, esse prefixo NÃO faz parte do número.
Gabriel Magana
3
@gmagana - Menciono isso em minha resposta (parágrafo 2)
Abtin Forouzandeh
1
Meu ponto é que não faz parte do número de telefone. É como dizer que o prefixo "1" de discagem de longa distância nacional dos EUA faz parte do número de telefone.
Gabriel Magana
1
@gmagana - embora você esteja certo de que não faz parte do número de telefone, é tecnicamente necessário fazer a chamada.
Abtin Forouzandeh
2
@Roger Pate: Passei um pouco de tempo tentando descobrir isso e espero que seja útil para outras pessoas. Também esperava que outra pessoa tivesse uma solução melhor (por isso não marquei minha própria resposta como aceita).
(i) permite prefixos internacionais válidos
(ii) seguidos de 9 ou 10 dígitos, com qualquer tipo ou colocação de delimitadores (exceto entre os dois últimos dígitos)
Eu sei que esta é uma resposta antiga, mas existe alguma opção para tornar o 1 opcional para números americanos?
Adam Fratino
O que você deseja fazer é (i) tornar o "+" opcional e (ii) o código internacional opcional. Então coloque "?" após o + e após o primeiro colchete de fechamento.
fezfox
@ManosPasgiannis bem sim, conforme especificado "seguido por 9 ou 10 dígitos". Apareceria em chipre que você usa 8, então apenas ajuste a última sequência removendo uma instância de \ d \ W * e faça a última expressão (\ d {1,3})
Pode ser uma boa solução, mas apenas para verificar os números de telefone, antes de usar esta biblioteca, você tem que importar uma grande quantidade de js ... porque libphonenumber.js precisa de uma biblioteca de encerramento ... não é uma solução leve: /
Funciona como um encanto. Para números de telefone holandeses também. Obrigado!
mauvm
2
Obviamente, há uma infinidade de maneiras de fazer isso, conforme evidenciado por todas as diferentes respostas dadas até agora, mas vou jogar meu valor de $ 0,02 aqui e fornecer a regex abaixo, que é um pouco mais concisa do que quase todas as anteriores , mas também mais completo do que a maioria. Também tem o bom efeito colateral de deixar o código do país em $ 1 e o número local em $ 2.
Sem críticas em relação a essas ótimas respostas, só quero apresentar a solução simples que uso para nossos criadores de conteúdo administrativo:
^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$
Forçar iniciar com mais ou dois zeros e usar pelo menos um pouco de números, espaço em branco, colchetes, menos e ponto é opcional e nenhum outro caractere. Você pode remover com segurança todos os não-números e usar isso em uma entrada tel :. Os números terão uma forma comum de representação e não preciso me preocupar em ser tão restritivo.
publicstaticboolean validateInternationalPhoneNumberFormat(String phone){StringBuilder sb =newStringBuilder(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?$");returnPattern.compile(sb.toString()).matcher(phone).find();}
Embora este trecho de código possa responder à pergunta, ele não fornece nenhum contexto para explicar como ou por quê. Considere adicionar uma frase ou duas para explicar sua resposta.
brandonscript
1
Aqui está um regex para os seguintes cenários de número de telefone mais comuns. Embora seja adaptado a partir de uma perspectiva dos EUA para códigos de área, funciona para cenários internacionais.
O número real deve ter apenas 10 dígitos.
Para números dos EUA, o código de área pode estar entre parênteses ().
O código do país pode ter de 1 a 3 dígitos. Opcionalmente, pode ser precedido por um sinal +.
Pode haver travessões, espaços, pontos ou nenhum espaço entre o código do país, código de área e o resto do número.
Um número de telefone válido não pode conter apenas zeros.
^- start of expression
(?!\b(0)\1+\b)-(?!)NegativeLook 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
Esta expressão Regex funciona para os números de telefone da Índia, Canadá, Europa, Nova Zelândia, Austrália, Estados Unidos, junto com seus códigos de país:
Corresponde a números com exatamente 12 dígitos, incluindo o código do país. Isso está errado porque não leva em conta a variabilidade de comprimento em todo o mundo. Além disso, o comprimento máximo é de 15 dígitos .
Respostas:
É o formato correto para corresponder a um número de telefone internacional genérico. Substituí o código de acesso internacional centrado em linha fixa dos EUA 011 pelo identificador de código de acesso internacional padrão '+', tornando-o obrigatório. Também alterei o mínimo do número nacional para pelo menos um dígito.
Observe que se você inserir números neste formato na agenda do seu celular, poderá ligar para qualquer número da agenda, não importa para onde vá. Para linhas fixas, substitua o sinal de mais pelo código de acesso internacional do país de onde você está discando.
Observe que isso NÃO leva em consideração as regras do plano de numeração nacional - especificamente, permite zeros e uns em locais que os planos de numeração nacionais podem não permitir e também permite comprimentos de número maiores do que o plano de numeração nacional para alguns países (por exemplo, os EUA).
fonte
^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
00
na frente. Do ponto de vista de desenvolvimento e manutenção, eu diria que é perfeitamente normal forçar todos os números para começar+
ou até mesmo substituir00
um+
cada vez que você o obtiver - especialmente porque a maioria das pessoas está ciente do+
formato (que a maioria dos campos internacionais de entrada de telefone exigir de qualquer maneira). Além disso, é uma correção de uma linha e muito mais legível. Essa abordagem também garantiria que todos os números de telefone estivessem no mesmo formato e tornaria sua validação muito menos sujeita a erros, tornando tudo mais fácil de manter.00
não enviava a mensagem corretamente, ao passo que começar com a+
sempre funcionaria internacionalmente. Podemos enlouquecer e torná-lo super complexo, mas às vezes é possível / vale a pena abandonar algumas restrições para tornar nossas vidas mais fáceis :)Todos os códigos de país são definidos pela ITU. O seguinte regex é baseado no ITU-T E.164 e no Anexo do Boletim Operacional ITU No. 930 - 15.IV.2009 . Ele contém todos os códigos de país atuais e códigos reservados para uso futuro. Embora pudesse ser um pouco abreviado, decidi incluir cada código de forma independente.
Isso é para chamadas originadas dos EUA. Para outros países, substitua o código de acesso internacional (o 011 no início da regex) pelo que for apropriado para o plano de discagem daquele país .
Além disso, observe que o ITU E.164 define o comprimento máximo de um número de telefone internacional completo para 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 1 dígito pode conter até 14 dígitos adicionais. Daí o
ao final da regex.
Mais importante ainda, esta regex não significa que o número é válido - cada país define seu próprio plano de numeração interno. Isso apenas garante que o código do país seja válido.
fonte
Esta é mais uma otimização.
(i) permite prefixos internacionais válidos
(ii) seguidos de 9 ou 10 dígitos, com qualquer tipo ou colocação de delimitadores (exceto entre os dois últimos dígitos)
Isso corresponderá a:
+ 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
fonte
Você pode usar a biblioteca libphonenumber do Google.
fonte
Isso funcionará para números internacionais;
C #:
JS:
fonte
Eu uso este:
Vantagens: reconhece + ou 011 inícios, permite que seja o tempo que for necessário e lida com muitas convenções de extensão. (#, x, ext, extensão)
fonte
Esta é uma versão "otimizada" do seu regex:
Você pode substituir o
\d
s por[0-9]
se sua sintaxe regex não for compatível\d
.fonte
Para iOS SWIFT , achei isso útil,
fonte
Expressão regular modificada de @ Eric - adicionada uma lista de todos os códigos de país (consegui-los em xxxdepy @ Github . Espero que seja útil:
fonte
Obviamente, há uma infinidade de maneiras de fazer isso, conforme evidenciado por todas as diferentes respostas dadas até agora, mas vou jogar meu valor de $ 0,02 aqui e fornecer a regex abaixo, que é um pouco mais concisa do que quase todas as anteriores , mas também mais completo do que a maioria. 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 +) $
fonte
Sem críticas em relação a essas ótimas respostas, só quero apresentar a solução simples que uso para nossos criadores de conteúdo administrativo:
Forçar iniciar com mais ou dois zeros e usar pelo menos um pouco de números, espaço em branco, colchetes, menos e ponto é opcional e nenhum outro caractere. Você pode remover com segurança todos os não-números e usar isso em uma entrada tel :. Os números terão uma forma comum de representação e não preciso me preocupar em ser tão restritivo.
fonte
Uma versão simples para números europeus, que corresponde a números como 0034617393211, mas também a números longos como 004401484172842.
Espero que ajude :·)
fonte
fonte
Aqui está um regex para os seguintes cenários de número de telefone mais comuns. Embora seja adaptado a partir de uma perspectiva dos EUA para códigos de área, funciona para cenários internacionais.
Um número de telefone válido não pode conter apenas zeros.
Explicação:
Mais exemplos e explicações - https://regex101.com/r/hTH8Ct/2/
fonte
Eu usei isso abaixo:
O formato + CCC.NNNNNNNNNNxEEEE ou 00CCC.NNNNNNNNNNxEEEE
O número de telefone deve começar com '+' ou '00' para uma chamada internacional. onde C é o código do país de 1 a 3 dígitos,
N tem até 14 dígitos,
e E é a extensão (opcional).
O sinal de adição inicial e o ponto após o código do país são obrigatórios. O caractere literal “x” é necessário apenas se uma extensão for fornecida.
fonte
Experimente a seguinte API para validação de número de telefone. Também retornará o País, Área e Provedor
demo https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0
fonte
O plano de numeração internacional é baseado no ITU E.164 plano de numeração . Acho que esse é o ponto de partida para sua expressão regular.
Vou atualizar isso se conseguir criar uma expressão regular com base na numeração ITU E.164.
fonte
Esta expressão Regex funciona para os números de telefone da Índia, Canadá, Europa, Nova Zelândia, Austrália, Estados Unidos, junto com seus códigos de país:
"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"
fonte
Isso funciona para mim, sem o prefixo 00, 001, 0011 etc:
fonte
Mesmo que isso não seja realmente usando RegExp para fazer o trabalho - ou talvez por causa disso - parece uma boa solução para mim: https://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
fonte
Experimente, funciona para mim.
fonte
Fiz o regexp para números de telefone europeus e é específico para prefixo de discagem vs comprimento do número.
fonte
Experimente, não sei se existe algum número de telefone maior que 12:
fonte
^(00|\+){1}\d{12,15}$
então?