Expressão regular para corresponder ao número de telefone padrão de 10 dígitos


125

Quero escrever uma expressão regular para um número de telefone do tipo americano padrão que suporte os seguintes formatos:

###-###-####
(###) ###-####
### ### ####
###.###.####

onde # significa qualquer número. Até agora eu vim com as seguintes expressões

^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}

respectivamente. Não tenho certeza se o último está correto para o cheque pontilhado. Também quero saber se há alguma maneira de escrever uma única expressão em vez das 4 diferentes que correspondem aos diferentes formatos que mencionei. Nesse caso, não tenho certeza de como faço isso. E também como faço para modificar a expressão / expressões para que eu possa também incluir uma condição para oferecer suporte ao código de área como componente opcional. Algo como

+1 ### ### ####

onde +1 é o código de área e é opcional.


5
possível duplicata de stackoverflow.com/questions/123559/… a resposta sugerida é retirar todos os caracteres não-dígitos. Desta forma, você simplifica a validação
Arnaud Denoyelle

1
Sei que isso foi há um tempo, mas não acho que os códigos de área dos EUA possam começar com 1. (123) 456-7890 seria inválido por causa do 1.
bobanahalf

Para uma resposta correta mais completa, consulte: stackoverflow.com/a/18626090/561710
Joe Johnston

Analisar números de telefone é difícil. O Google lançou uma biblioteca de código aberto para isso. Sirva-se, use libphonenumber (ou um fork no seu idioma)
aloisdg mudando para codidact.com

Respostas:


212
^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$

Corresponde ao seguinte

123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890

Se você não quiser uma correspondência com números fora dos EUA, use

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

Atualização:
Como notado pelo usuário Simon Weaver abaixo, se você também estiver interessado em combinar números não formatados, basta tornar a classe de caractere separador opcional como[\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

1
Você acha que o ponto de interrogação não é necessário em (? \ D {3}) parte da sua primeira linha? Acho que precisamos de uma ou mais ocorrências e não de zero ou uma ocorrência de um dígito entre '(' e ')'
noobcoder

2
O ?lá aplica-se aos parênteses (), não aos dígitos. O regex relacionado completo é \(?\d{3}\)?. \d{3}especifica que deve haver três dígitos entre os ()que são (tornados) opcionais (por ?).
Ravi Thapliyal

6
observação: isso não corresponde a 1234567890, o que pode ou não ser um problema. para mim era - então adicionei ?depois de cada um [\s.-]para torná-lo opcional
Simon_Weaver

1
@Simon_Weaver Obrigado por suas contribuições. Acrescentei sua observação à resposta.
Ravi Thapliyal de

3
Se você quiser um que evite o problema mencionado por @BobRay, use ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$. (Basicamente, apenas dupliquei o segmento do RegEx que cobre o código de área e permiti uma variante com parênteses e outra sem)
Shrey Gupta

128

Existem muitas variações possíveis para este problema. Aqui está uma expressão regular semelhante a uma resposta que coloquei anteriormente no SO.

^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$

Ele corresponderia aos seguintes exemplos e muito mais:

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234

Independentemente da forma como o número de telefone é inserido, os grupos de captura podem ser usados ​​para decompor o número de telefone para que você possa processá-lo em seu código.

  • Grupo1: Código do país (ex: 1 ou 86)
  • Grupo2: Código de área (ex: 800)
  • Grupo 3: Troca (ex: 555)
  • Grupo4: Número do assinante (ex: 1234)
  • Grupo5: Extensão (ex: 5678)

Aqui está uma análise da expressão se você estiver interessado:

^\s*                #Line start, match any whitespaces at the beginning if any.
(?:\+?(\d{1,3}))?   #GROUP 1: The country code. Optional.
[-. (]*             #Allow certain non numeric characters that may appear between the Country Code and the Area Code.
(\d{3})             #GROUP 2: The Area Code. Required.
[-. )]*             #Allow certain non numeric characters that may appear between the Area Code and the Exchange number.
(\d{3})             #GROUP 3: The Exchange number. Required.
[-. ]*              #Allow certain non numeric characters that may appear between the Exchange number and the Subscriber number.
(\d{4})             #Group 4: The Subscriber Number. Required.
(?: *x(\d+))?       #Group 5: The Extension number. Optional.
\s*$                #Match any ending whitespaces if any and the end of string.

Para tornar o código de área opcional, basta adicionar um ponto de interrogação após (\ d {3}) para o código de área.


7
melhor resposta IMHO. Para o meu propósito, o \sno início e no final não são necessários, porque estou usando para validação e o campo já está aparado.
Daniel

1
De longe a melhor resposta e mais completa. Eu também aprecio muito a análise de regex.
Bryant Jackson

@Kondal Estou curioso sobre a entrada que você está usando para fazer com que ele falhe. Parece funcionar bem para mim com um 0 para o código do país.
Francis Gagnon

<input type = "text" name = "phone_no" class = "form-control" ng-pattern = "^ \ s * (?: \ +? (\ d {1,3}))? [-. (] * (\ d {3}) [-.)] * (\ d {3}) [-.] * (\ d {4}) (?: * x (\ d +))? \ s * $ "apenas -numbers ng-maxlength = "10" />
Kondal

@Kondal Desculpe. Eu quis dizer que o texto que você está tentando corresponder está falhando com esta regex.
Francis Gagnon

8

^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

Corresponde a estes números de telefone:

1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

Veja regex101.com


7

Aqui está um bastante compacto que criei.

Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

Replace: +1 \($1\) $2-$3

Testado em relação aos seguintes casos de uso.

18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
1--800--123--4567
+1 (800) 123-4567

Corresponde a coisas como (800 444-4444
Jake

6

Adicionando um exemplo usando as soluções mencionadas acima no jsfiddle. Eu modifiquei o código um pouco de acordo com os requisitos dos meus clientes. Espero que isso também ajude alguém.

/^\s*(?:\+?(\d{1,3}))?[- (]*(\d{3})[- )]*(\d{3})[- ]*(\d{4})(?: *[x/#]{1}(\d+))?\s*$/

Veja o exemplo aqui


4

tente isso para usuários paquistaneses. Aqui está um bastante compacto que eu criei.

((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

Testado em relação aos seguintes casos de uso.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883

4

Regex do número de telefone que eu uso: /^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/

Capas:

  • 18001234567
  • 1 800 123 4567
  • +1 800 123-4567
  • +86 800 123 4567
  • 1-800-123-4567
  • 1 (800) 123-4567
  • (800)123-4567
  • (800) 123-4567
  • (800) 1234567
  • 800-123-4567
  • 800.123.4567

2

As expressões para 1, 3 e 4 são bastante semelhantes, então você pode usar:

^([1-9]\d{2})([- .])(\d{3})$2(\d{4})$

Observe que, dependendo do idioma e da marca dos regexes usados, pode ser necessário colocar no \2lugar de $2ou tal correspondência pode não ser suportada de todo.

Não vejo uma boa maneira de combinar isso com o formato 2, além do óbvio ^(regex for 1,3,4|regex for 2)$que é feio, desajeitado e torna difícil extrair as partes dos números.

Quanto ao código de área, você pode adicionar (\+\d)?ao início para capturar um código de área de um único dígito (desculpe, não sei o formato de seus códigos de área).


2

Que tal agora?

^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}

EDIT: Esqueci-me do (). EDIT 2: entendi errado a primeira parte de 3 dígitos.


Não há necessidade de escapar de ponto .quando em uma classe de caractere, então [-\.\s]deveria ser [-.\s], porque não queremos combinar uma barra invertida.
Vedran Šego

Isso realmente corresponderia à barra invertida? Achei que não fosse necessário, mas não tinha 100% de certeza.
crimson_penguin

Você está certo. Acabei de experimentar (nunca precisei de uma barra invertida antes) e [\.]e [.]ambos correspondem apenas a ponto, enquanto [\\.]corresponde a ponto e barra invertida. Obrigado por sua observação.
Vedran Šego

Minha opinião sobre regexes é que, se você estiver dando uma regex para alguém, sempre acompanhe com uma explicação, ou a regex não terá valor. Apenas minha opinião.
John Red

2

Começando com a resposta de @Ravi, também apliquei algumas regras de validação para o Código NPA (Área) .

Em particular:

  • Deve começar com 2 (ou superior)
  • Não pode ter "11" como segundo e terceiro dígitos (N11).

Existem algumas outras restrições, incluindo blocos reservados (N9X, 37X, 96X) e 555, mas eu os deixei de fora, principalmente porque os blocos reservados podem ter uso futuro, e 555 é útil para teste.

Isso é o que eu descobri:

^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$

Como alternativa, se você também quiser combinar valores em branco (se o campo não for obrigatório), você pode usar:

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$)

Meus casos de teste para números válidos (muitos da resposta de @Francis) são:

18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234

Meus casos de teste inválidos incluem:

(003) 555-1212     // Area code starts with 0
(103) 555-1212     // Area code starts with 1
(911) 555-1212     // Area code ends with 11
180055512345       // Too many digits
1 800 5555 1234    // Prefix code too long
+1 800 555x1234    // Invalid delimiter
+867 800 555 1234  // Country code too long
1-800-555-1234p    // Invalid character
1 (800)  555-1234  // Too many spaces
800x555x1234       // Invalid delimiter
86 800 555 1212    // Non-NA country code doesn't have +

Minha expressão regular não inclui agrupamento para extrair os grupos de dígitos, mas pode ser modificada para incluí-los.


2

Talvez o mais fácil em comparação com vários outros.

\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

Corresponde ao seguinte:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


Perfeito ... Obrigado (y)
Sushil Sharma

2

Este código corresponderá a um número de telefone dos EUA ou Canadá e também garantirá que é um código de área válido e troca:

^((\+1)?[\s-]?)?\(?[2-9]\d\d\)?[\s-]?[2-9]\d\d[\s-]?\d\d\d\d

Teste em Regex101.com


2

Padrão Regex para validar um número de telefone regular de 10 dígitos mais o código internacional opcional (1 a 3 dígitos) e o número do ramal opcional (qualquer número de dígitos):

/(\+\d{1,3}\s?)?((\(\d{3}\)\s?)|(\d{3})(\s|-?))(\d{3}(\s|-?))(\d{4})(\s?(([E|e]xt[:|.|]?)|x|X)(\s?\d+))?/g

Demo: https://www.regextester.com/103299

Entradas válidas:

/* Full number */
+999 (999) 999-9999 Ext. 99999

/* Regular local phone number (XXX) XXX-XXXX */
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123)123 1231
(123) 123-1231
(123) 123 1231

/* International codes +XXX (XXX) XXX-XXXX */
+99 1234567890
+991234567890

/* Extensions (XXX) XXX-XXXX Ext. XXX... */
1234567890 Ext 1123123
1234567890Ext 1123123
1234567890 Ext1123123
1234567890Ext1123123

1234567890 Ext: 1123123
1234567890Ext: 1123123
1234567890 Ext:1123123
1234567890Ext:1123123

1234567890 Ext. 1123123
1234567890Ext. 1123123
1234567890 Ext.1123123
1234567890Ext.1123123

1234567890 ext 1123123
1234567890ext 1123123
1234567890 ext1123123
1234567890ext1123123

1234567890 ext: 1123123
1234567890ext: 1123123
1234567890 ext:1123123
1234567890ext:1123123

1234567890 X 1123123
1234567890X1123123
1234567890X 1123123
1234567890 X1123123
1234567890 x 1123123
1234567890x1123123
1234567890 x1123123
1234567890x 1123123

1

Acho esta expressão regular mais útil para um número de contato de 10 dígitos:

^(?:(?:\+|0{0,2})91(\s*[\-]\s*)?|[0]?)?[789]\d{9}$

Referência : https://regex101.com/r/QeQewP/1

Explicação:

insira a descrição da imagem aqui


Você usou uma ferramenta para gerar essa explicação? Compartilhe! Obrigado
desconhecido

@unnknown Parece uma captura de tela de um verificador de regex online, como regex101.com. Observe que as diretrizes do SO afirmam que todo texto, código, dados e mensagens de erro devem ser inseridos na forma de texto, não imagens, porque o texto nas imagens pode ser difícil de ler, especialmente em dispositivos móveis, e incorre em maior largura de banda. Além disso, o texto não pode ser copiado e colado. Nesse caso, as cores podem acrescentar algo, não tenho certeza. Saiba que geralmente, "Respostas" deve incluir uma explicação textual. Amitesh: seria útil incluir um link para este site, com sua regex já preenchida para os visitantes experimentarem.
SherylHohman

@unnknown aqui é um link que produz uma imagem semelhante a esta neste post. A string regex de Amitesh já foi colada. Você pode inserir números de telefone para testar seus resultados: regex101.com/r/QeQewP/1
SherylHohman

0
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}

0

Esta é uma versão mais abrangente que corresponderá tanto quanto eu posso pensar, bem como fornecerá correspondência de grupo para país, região, primeiro e último.

(?<number>(\+?(?<country>(\d{1,3}))(\s|-|\.)?)?(\(?(?<region>(\d{3}))\)?(\s|-|\.)?)((?<first>(\d{3}))(\s|-|\.)?)((?<last>(\d{4}))))

0

que tal vários números com "+" e separá-los com ";" "," "-" ou "" caracteres?


0

Acabei com

const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');

isso era para permitir coisas como números holandeses, por exemplo

+358 300 20200


0

Acima do regex está uma ligeira modificação de @Francis Gagnon.

Objetivo: detectar qualquer padrão possível, um usuário pode compartilhar seu número de telefone nos EUA


Versão 1:

^\s*(?:\+?(\d{1,3}))?[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

Teste aqui Codepen: https://codepen.io/kiranbhattarai/pen/NWKMXQO

Explicação do regex: https://regexr.com/4kt5j


Versão 2:

\s*(?:\+?(\d{1,3}))?[\W\D\s]^|()*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d)[\W\D\s]*(\d[\W\D\s]*?\d[\D\W\s]*?\d[\W\D\s]*?\d)(?: *x(\d+))?\s*$

O que contém: os casos de teste podem fazer parte da string. Na versão um, os casos de teste devem ser o início de uma linha para o trabalho.

Codepen: https://codepen.io/kiranbhattarai/pen/GRKGNGG

Explicação do regex: https://regexr.com/4kt9n


Se você encontrar um padrão que pode falhar, por favor, comente, eu irei consertá-lo.

Casos de teste: aprovado

8 0   0  4  4  4  5   55 5
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
800 555 1234x5678
8005551234 x5678
1    800    555-1234
1----800----555-1234
800 (555) 1234
800(555)1234
8 0 0 5 5 5 1 2 3 4
8.0.0.5.5.5.1.2.3.4
8-0-0-5-5-5-1-2-3-4
(8)005551234
(80)05551234
8(00)5551234
8@0@0@5551234
8/0/0/5/5/5/1/2/3/4
8*0*0*5*5*5*1*2*3*4
8:0:0:5:5:5:1:2:3:4
8,0,0,5,5,5,1,2,3,4
800,555,1234
800:555:1234
1-718-444-1122
718-444-1122
(718)-444-1122
17184441122
7184441122
718.444.1122
1718.444.1122
1-123-456-7890
1 123-456-7890
1 (123) 456-7890
1 123 456 7890
1.123.456.7890
+91 (123) 456-7890
18005551234
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
18001234567
1 800 123 4567
1-800-123-4567
+18001234567
+1 800 123 4567
+1 (800) 123 4567
1(800)1234567
+1800 1234567
1.8001234567
1.800.123.4567
+1 (800) 123-4567
18001234567
1 800 123 4567
+1 800 123-4567
+86 800 123 4567
1-800-123-4567
1 (800) 123-4567
(800)123-4567
(800) 123-4567
(800)1234567
800-123-4567
800.123.4567
1231231231
123-1231231
123123-1231
123-123 1231
123 123-1231
123-123-1231
(123)123-1231
(123) 123-1231
(123) 123 1231
+99 1234567890
+991234567890
(555) 444-6789
555-444-6789
555.444.6789
555 444 6789
1 800 555 1234
+1 800 555-1234
+86 800 555 1234
1-800-555-1234
1.800.555.1234
+1.800.555.1234
1 (800) 555-1234
(800)555-1234
(800) 555-1234
(800)5551234
800-555-1234
800.555.1234
(003) 555-1212
(103) 555-1212
(911) 555-1212
18005551234
1 800 555 1234
+86 800-555-1234
1 (800) 555-1234

+86, +99 etc definitivamente não são números de telefone dos EUA. Vários de seus outros casos de teste parecem duvidosos por outros motivos.
tripleee

@tripleee deixe-me consertar isso, eu atualizei para qualquer país e espero que funcione. Além disso, também removi os casos de teste duplicados
Kiran Bhattarai

0

Estou apenas colocando esta resposta lá, pois ela resolve um problema meu, é baseada na resposta de @ stormy, mas inclui códigos de país de 3 dígitos e, mais importante, pode ser usada em qualquer lugar em uma string, mas não corresponderá se não for precedido por um espaço / início da string e terminando com um limite de palavra. Isso é útil para que não corresponda a números aleatórios no meio de um URL ou algo assim

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.