Expresión regular para que coincida con el número de teléfono estándar de 10 dígitos


125

Quiero escribir una expresión regular para un número de teléfono de tipo estándar de EE. UU. Que admita los siguientes formatos:

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

donde # significa cualquier número. Hasta ahora se me ocurrieron las siguientes expresiones

^[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. No estoy muy seguro de si el último es correcto para el cheque con puntos. También quiero saber si hay alguna forma de que pueda escribir una sola expresión en lugar de las 4 diferentes que se adaptan a los diferentes formatos que mencioné. Si es así, no estoy seguro de cómo lo hago. Y también cómo modifico la expresión / expresiones para que también pueda incluir una condición para admitir el código de área como componente opcional. Algo como

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

donde +1 es el código de área y es opcional.


5
posible duplicado de stackoverflow.com/questions/123559/… la respuesta sugerida es eliminar todos los caracteres que no sean dígitos. De esta manera, simplificas la validación
Arnaud Denoyelle

1
Sé que esto fue hace un tiempo, pero no creo que los códigos de área de EE. UU. Puedan comenzar con 1. (123) 456-7890 no serían válidos debido al 1.
bobanahalf

Para obtener una respuesta correcta más completa, consulte: stackoverflow.com/a/18626090/561710
Joe Johnston

Analizar números de teléfono es difícil. Google lanzó una biblioteca de código abierto para esto. Sírvase usted mismo, use libphonenumber (o un tenedor en su idioma)
aloisdg se muda a codidact.com

Respuestas:


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

Coincide con lo siguiente

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

Si no desea una coincidencia en números que no sean de EE. UU., Use

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

Actualización:
como lo notó el usuario Simon Weaver a continuación, si también está interesado en hacer coincidir números sin formato, simplemente haga que la clase de carácter separador sea opcional como[\s.-]?

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

1
¿Crees que el signo de interrogación no es necesario en (? \ D {3}) parte de tu primera línea? Creo que necesitamos una o más ocurrencias y no cero o una ocurrencia de un dígito dentro del '(' y ')'
noobcoder

2
El ?no se aplica a los paréntesis (), no a los dígitos. La expresión regular relacionada completa es \(?\d{3}\)?. \d{3}especifica que debe haber tres dígitos entre los ()que son (hechos) opcionales (por ?).
Ravi Thapliyal

6
nota: esto no coincide con 1234567890, que puede ser un problema o no. para mí lo fue, así que solo agregué ?después de cada uno [\s.-]para que sea opcional
Simon_Weaver

1
@Simon_Weaver Gracias por sus aportes. Agregué tu observación a la respuesta.
Ravi Thapliyal

3
Si desea uno que evite el problema que mencionó @BobRay, use ^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$. (Básicamente, solo dupliqué el segmento de la expresión regular que cubre el código de área y
permití

128

Hay muchas variaciones posibles para este problema. Aquí hay una expresión regular similar a una respuesta que coloqué anteriormente en SO.

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

Coincidiría con los siguientes ejemplos y mucho más:

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

Independientemente de la forma en que se ingrese el número de teléfono, los grupos de captura se pueden usar para desglosar el número de teléfono para que pueda procesarlo en su código.

  • Grupo1: Código de país (ej: 1 o 86)
  • Grupo2: Código de área (ej .: 800)
  • Grupo3: Intercambio (ex: 555)
  • Grupo4: Número de suscriptor (por ejemplo: 1234)
  • Grupo5: Extensión (ex: 5678)

Aquí hay un desglose de la expresión si está interesado:

^\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 que el código de área sea opcional, simplemente agregue un signo de interrogación después de (\ d {3}) para el código de área.


7
mejor respuesta en mi humilde opinión. Para mi propósito, \sal principio y al final no son necesarios, porque lo estoy usando para la validación y el campo ya está recortado.
Daniel

1
De lejos, la mejor respuesta y la más completa. También aprecio mucho el desglose de las expresiones regulares.
Bryant Jackson

@Kondal Tengo curiosidad sobre la entrada que estás usando para que falle. Parece funcionar bien para mí con un 0 para el código de 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 * $ "solamente -numbers ng-maxlength = "10" />
Kondal

@Kondal Lo siento. Me refiero al texto que está intentando hacer coincidir que está fallando con esta expresión regular.
Francis Gagnon

8

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

Coincide con estos números de teléfono:

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

Ver regex101.com


7

Aquí hay uno bastante compacto que creé.

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

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

Probado en los siguientes 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

Esto coincide con cosas como (800444-4444
Jake

6

Agregando un ejemplo usando las soluciones mencionadas anteriormente en jsfiddle. He modificado un poco el código según los requisitos de mis clientes. Espero que esto también ayude a alguien.

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

Ver ejemplo aquí


4

prueba esto para los usuarios de Pakistán. Aquí hay uno bastante compacto que creé.

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

Probado en los siguientes casos de uso.

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

4

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

Cubiertas:

  • 18001234567
  • 1 800 123 4567
  • + 1800 123-4567
  • +86800 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

Las expresiones para 1, 3 y 4 son bastante similares, por lo que puede usar:

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

Tenga en cuenta que, según el idioma y la marca de expresiones regulares que se utilicen, es posible que deba poner en \2lugar de $2o que tal coincidencia no sea compatible en absoluto.

No veo una buena manera de combinar esto con el formato 2, aparte de lo obvio ^(regex for 1,3,4|regex for 2)$que es feo, torpe y hace que sea difícil sacar las partes de los números.

En cuanto al código de área, puede agregar (\+\d)?al principio para capturar un código de área de un solo dígito (lo siento, no conozco el formato de sus códigos de área).


2

¿Qué tal esto?

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

EDITAR: Me olvidé del (). EDITAR 2: Se equivocó la primera parte de los 3 dígitos.


No hay necesidad de escapar del punto .cuando se está en una clase de carácter, por lo que [-\.\s]debería serlo [-.\s], porque no queremos hacer coincidir una barra invertida.
Vedran Šego

¿Coincidiría realmente con la barra invertida? Pensé que podría no ser necesario, pero no estaba 100% seguro.
crimson_penguin

Tienes razón. Lo acabo de probar (nunca antes necesité una barra invertida) [\.]y [.]ambos coinciden solo con el punto, mientras que [\\.]coincide con el punto y la barra invertida. Gracias por tu comentario.
Vedran Šego

Mi opinión sobre las expresiones regulares es que, si le está dando una expresión regular a alguien, siempre acompáñela con una explicación, o la expresión regular no tiene valor. Solo es mi opinión.
John Red

2

Comenzando con la respuesta de @ Ravi, también apliqué algunos reglas de validación para el código NPA (área) .

En particular:

  • Debe comenzar con 2 (o más)
  • No puede tener "11" como segundo y tercer dígitos (N11).

Hay un par de otras restricciones, incluidos los bloques reservados (N9X, 37X, 96X) y 555, pero los dejé fuera, sobre todo porque los bloques reservados pueden tener un uso futuro, y el 555 es útil para realizar pruebas.

Esto es lo que se me ocurrió:

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

Alternativamente, si también desea hacer coincidir valores en blanco (si el campo no es obligatorio), puede usar:

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

Mis casos de prueba para números válidos (muchos de la respuesta de @Francis) son:

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

Mis casos de prueba no válidos incluyen:

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

Mi expresión regular no incluye agrupación para extraer los grupos de dígitos, pero se puede modificar para incluirlos.


2

Quizás el más fácil se compare con varios otros.

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

Coincide con lo siguiente:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


Perfecto ... Gracias (y)
Sushil Sharma

2

Este código coincidirá con un número de teléfono de EE. UU. O Canadá y también garantizará que sea un código de área y un intercambio válidos:

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

Prueba en Regex101.com


2

Patrón de expresiones regulares para validar un número de teléfono normal de 10 dígitos más un código internacional opcional (de 1 a 3 dígitos) y un número de extensión opcional (cualquier 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

Demostración: 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

Encuentro esta expresión regular más útil para mí para el número de contacto de 10 dígitos:

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

Referencia : https://regex101.com/r/QeQewP/1

Explicación:

ingrese la descripción de la imagen aquí


¿Usó alguna herramienta para generar esa explicación? ¡Comparte! Gracias
desconocido

@unnknown Parece una captura de pantalla de un verificador de expresiones regulares en línea, como regex101.com. Tenga en cuenta que las pautas de SO establecen que todo el texto, código, datos y mensajes de error deben ingresarse en forma de texto, no imágenes, porque el texto en imágenes puede ser difícil de leer, particularmente en dispositivos móviles, y requiere un mayor ancho de banda. Además, el texto no se puede copiar y pegar. En este caso, los colores pueden agregar algo, no estoy seguro. Sepa que, en general, las "Respuestas" deben incluir una explicación textual. Amitesh: sería útil incluir un enlace a este sitio, con su expresión regular ya poblada para que los visitantes puedan experimentar.
SherylHohman

@unnknown aquí hay un enlace que produce una imagen similar a la de esta publicación. La cadena de expresiones regulares de Amitesh ya se ha pegado. Puede ingresar números de teléfono para probar sus 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 es una versión más completa que coincidirá tanto como se me ocurra, así como también te brindará una coincidencia de grupos por país, región, primero y último.

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

0

¿qué pasa con varios números con "+" y sepárelos con ";" "," "-" o "" caracteres?


0

Terminé con

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

esto fue para permitir cosas como números holandeses, por ejemplo

+358300 20200


0

Por encima de la expresión regular hay una ligera modificación de @Francis Gagnon.

Objetivo: detectar cualquier patrón posible, un usuario puede compartir su número de teléfono de EE. UU.


Versión 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*$

Pruébelo aquí Codepen: https://codepen.io/kiranbhattarai/pen/NWKMXQO

Explicación de la expresión regular: https://regexr.com/4kt5j


Versión 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*$

Contenido: los casos de prueba pueden ser parte de la cadena. En la versión uno, los casos de prueba deberían ser el comienzo de una línea para que funcione.

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

Explicación de la expresión regular: https://regexr.com/4kt9n


Si puede encontrar un patrón que puede fallar, por favor comente y lo arreglaré.

Casos de prueba: aprobado

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 no son números de teléfono de EE. UU. Varios de sus otros casos de prueba parecen dudosos por otras razones.
tripleee

@tripleee déjame arreglar eso, lo he actualizado a cualquier país, espero que funcione. Además, eliminé los casos de prueba duplicados también
Kiran Bhattarai

0

Solo estoy lanzando esta respuesta allí, ya que resuelve un problema mío, se basa en la respuesta de @ stormy, pero incluye códigos de país de 3 dígitos y, lo que es más importante, se puede usar en cualquier lugar de una cadena, pero no coincidirá si no es precedido por un espacio / inicio de la cadena y terminando con un límite de palabra. Esto es útil para que no coincida con números aleatorios en medio de una URL o algo

((?:\s|^)(?:\+\d{1,3}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4})(?:\b)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.