Expressão Regular para corresponder ao número de telefone normal de 10 dígitos

quero escrever uma expressão regular para um número de telefone normal do tipo dos EUA que suporte os seguintes formatos:

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

Onde # significa qualquer número. Até agora eu cheguei 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 a certeza se o último está correcto para o controlo pontilhado. Eu também quero saber se há alguma maneira que eu poderia escrever uma única expressão em vez dos 4 diferentes que atendem aos formatos diferentes que mencionei. Em caso afirmativo, não sei como eu faço isso. E também Como posso modificar a expressão / expressões para que eu possa também incluir uma condição para suportar o código de área como componente opcional. Algo como

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

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

Author: noobcoder, 2013-05-22

17 answers

^(\+\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 não quiser uma correspondência em números fora dos EUA use

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

actualizar :
Como observado pelo Usuário Simon Weaver abaixo, se você também está interessado em corresponder em números não formatados apenas tornar a classe de caractere separador opcional como [\s.-]?

^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
 124
Author: Ravi Thapliyal, 2015-01-12 15:13:54

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

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

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 quebrar o número de telefone para que você possa processá-lo em seu código.

  • Grupo 1: Código do país (ex: 1 ou 86)
  • Grupo 2: Código da área (ex: 800)
  • Grupo 3: Bolsa (ex: 555)
  • Grupo 4: Número de assinante (ex: 1234)
  • Grupo 5: extensão (ex: 5678)

Aqui está uma descrição da expressão se 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 o (\d{3}) para o código de área.

 76
Author: Francis Gagnon, 2013-05-22 23:10:45

Adicionando um exemplo usando as soluções acima mencionadas no jsfiddle. Modifiquei o código de acordo com as exigências dos meus clientes. Espero que isto também ajude alguém.

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

Veja O Exemplo Aqui

 6
Author: Avinash Lad, 2016-10-28 11:35:18
Aqui está uma muito compacta que eu criei.
Search: \+?1?\s*\(?-*\.*(\d{3})\)?\.*-*\s*(\d{3})\.*-*\s*(\d{4})$

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

Testado nos seguintes casos de Utilização.

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
 4
Author: Puneet Lamba, 2014-11-25 16:26:51

As expressões para 1, 3 e 4 são bastante semelhantes, por isso pode usar:

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

Note que, dependendo da língua e da marca dos regexes usados, você pode precisar de colocar \2 em vez de $2 ou essa correspondência pode não ser suportada de todo.

Não vejo uma boa maneira de combinar isto com o formato 2, além do óbvio {[[3]} que é feio, desajeitado e torna difícil sair das partes dos números.

Quanto ao código da área, pode adicionar (\+\d)? ao início de capture um código de área de um dígito (desculpe, eu não sei o formato de seus códigos de área).

 2
Author: Vedran Šego, 2013-05-22 18:36:41
Que tal isto?
^(\+?[01])?[-.\s]?\(?[1-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}

EDIT: esqueci-me do () um. EDIT 2: a primeira parte de 3 dígitos está errada.

 2
Author: crimson_penguin, 2013-05-22 18:45:48
Tenta isto para os utilizadores paquistaneses .Aqui está um bastante compacto que eu criei.
((\+92)|0)[.\- ]?[0-9][.\- ]?[0-9][.\- ]?[0-9]

Testado nos seguintes casos de Utilização.

+92 -345 -123 -4567
+92 333 123 4567
+92 300 123 4567
+92 321 123 -4567
+92 345 - 540 - 5883
 2
Author: sajid, 2016-03-14 19:06:46

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

Abrange:

  • 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
Author: Yevhen Kotliar, 2018-08-31 20:00:38
Talvez a mais fácil se compare a várias outras.
\(?\d+\)?[-.\s]?\d+[-.\s]?\d+

Corresponde ao seguinte:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789

 1
Author: MITHU, 2016-11-19 12:50:31

Este código irá corresponder a um número de telefone americano ou Canadiano, e também irá certificar-se de 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

Ensaio em Regex101.com

 1
Author: Shino, 2018-03-30 14:56:56

Expressão regular padrão para validar um regular de 10 dígitos do número de telefone mais opcional código internacional (1 a 3 dígitos) e opcional número do ramal (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

Menções 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
Author: bocanegra, 2018-05-01 19:49:33
^(\+1)?\s?(\([1-9]\d{2}\)|[1-9]\d{2})(-|\s|.)\d{3}(-|\s|.)\d{4}
 0
Author: amalgamate, 2013-05-22 18:44:25

Começando pela 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 mais)
  • 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 deixei-os de fora, particularmente porque os blocos reservados podem ver o uso futuro, e 555 é útil para teste.

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

Alternadamente, se também quiser corresponder aos valores em branco( se o campo não for necessário), pode usar:

(^((\+\d{1,2}|1)[\s.-]?)?\(?[2-9](?!11)\d{2}\)?[\s.-]?\d{3}[\s.-]?\d{4}$|^$)
Os 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

Os 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 +

A minha expressão regular não inclui o agrupamento para extrair os grupos de algarismos, mas pode ser modificada para incluir esses.

 0
Author: MCattle, 2016-07-28 22:24:02
{[[2]} esta é uma versão mais abrangente que vai corresponder tanto quanto eu posso pensar, bem como dar-lhe Grupo de correspondência para o 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
Author: jake, 2016-08-16 21:57:57

E que tal múltiplos números com " + "e separá-los com";"", "" - " ou "" caracteres?

 0
Author: radeveloper, 2017-11-06 07:16:37

Acabei com

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

Isto foi para permitir coisas como números holandeses, por exemplo

+358 300 20200

 0
Author: Kelly Milligan, 2018-06-21 14:01:53

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

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

Anotações :

enter image description here

 0
Author: FullStack, 2018-09-05 13:06:23