solo regulares regular rango que probar palabra numeros mayores letras expresiones expresion exacta espacios espacio ejemplos blanco alfanumerico regex pattern-matching

regex - regulares - Expresión regular para coincidir con el número de teléfono estándar de 10 dígitos



expresiones regulares ejemplos javascript (15)

Quiero escribir una expresión regular para un número de teléfono tipo estadounidense estándar 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 seguro de si el último es correcto para el cheque de 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.


¿Qué pasa con los números múltiples con "+" y separarlos con ";" "," "-" o "" caracteres?


¿Qué tal esto?

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

EDITAR: me olvidé del () uno. EDIT 2: obtuve la primera parte de 3 dígitos incorrecta.


Agregando un ejemplo utilizando las soluciones mencionadas anteriormente en jsfiddle. He modificado el código un poco según el requisito 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í


Aquí hay uno bastante compacto que creé.

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

Probado contra 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


Comenzando con la respuesta de @ Ravi, también apliqué algunas reglas de validación para el Código NPA (Área) .

En particular:

  • Debe comenzar con un 2 (o superior)
  • No puede tener "11" como segundo y tercer dígito (N11).

Hay un par de otras restricciones, incluidos los bloques reservados (N9X, 37X, 96X) y 555, pero los dejé, sobre todo porque los bloques reservados pueden ver el uso futuro, y el 555 es útil para las 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 invá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 la agrupación para extraer los grupos de dígitos, pero se puede modificar para incluirlos.


Esta es una versión más completa que coincidirá tanto como puedo pensar, además de darle coincidencia de grupo para el país, la región, el primero y el último.

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


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

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

Prueba en Regex101.com


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

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

Concuerda 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)
  • Grupo 3: Intercambio (ej: 555)
  • Grupo4: Número de suscriptor (por ejemplo, 1234)
  • Grupo5: Extensión (ej: 5678)

Aquí hay un desglose de la expresión si estás 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 del (/ d {3}) para el código de área.


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

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

Tenga en cuenta que, dependiendo del idioma y la marca de expresiones regulares utilizadas, es posible que necesite poner /2 lugar de $2 o que tal coincidencia podría no ser compatible.

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 los códigos de área).


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


Quizás el más fácil se compara con muchos otros.

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

Concuerda con lo siguiente:

(555) 444-6789

555-444-6789

555.444.6789

555 444 6789


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 era para permitir cosas como números holandeses, por ejemplo

+358 300 20200


intente esto para los usuarios pakistaníes. Este es uno bastante compacto que creé.

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

Probado contra 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


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


^(/+/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 no estadounidenses, use

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

Actualización:
Como 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 caracteres separadores sea opcional como [/s.-]?

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