Patrones1 caza jugable incluida

Regex para números de teléfono: formatos de EE. UU., E.164 y cuándo parar

La gente escribe el mismo número de teléfono de una docena de maneras. Cómo reconocer números de EE. UU. con guiones, puntos, espacios, paréntesis y un +1 opcional, cómo comprobar el formato internacional E.164 y por qué una validación de verdad necesita una biblioteca.

Logo de Regex Hunter

· 8 min de lectura · Actualizado el

/^\d{3}[-. ]?\d{3}[-. ]?\d{4}$/

atrapa

  • 555-123-4567
  • 555.123.4567
  • 5551234567

deja libre

  • 555-1234
  • 55-123-4567
  • 555-123-456

Pide su número de teléfono a diez personas y te llegará de diez formas: 555-123-4567, (555) 123-4567, 555.123.4567, +1 555 123 4567, 5551234567. Todas son el mismo número.

Una regex de teléfono tiene que aceptar las formas que la gente escribe de verdad y aun así detectar los errores evidentes. Este artículo construye un patrón para EE. UU. pieza a pieza, luego aborda el formato internacional y termina con lo que una regex no puede hacer. Todos los ejemplos son interactivos, así que edita los patrones y mira cómo cambian las líneas.

Respuesta rápidaJavaScript
/^(\+?1[-. ]?)?(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$/

Un número de EE. UU. de 10 dígitos, con guiones, puntos o espacios opcionales, paréntesis alrededor del código de área y un +1 opcional al principio.

Acepta

  • 555-123-4567
  • (555) 123-4567
  • +1 555.123.4567

Rechaza

  • 555-1234
  • 55-123-4567
  • 555-123-45678

01Empieza por los dígitos

Un número de EE. UU. tiene un código de área de 3 dígitos, un prefijo de central de 3 dígitos y un número de línea de 4. La versión más estricta acepta exactamente un formato:

Coincidencias4/4 como se esperaba
/^\d{3}-\d{3}-\d{4}$/

Debe coincidir1/1

  • 555-123-4567

No debe3/3

  • 555.123.4567
  • 555 123 4567
  • 555-1234
Pruébalo en la Zona de pruebas
Solo pasa la forma con guiones. Las versiones con puntos y con espacios son el mismo número, y se rechazan.

Está bien si controlas la máscara de entrada. Si la gente escribe libremente, es demasiado estricta.

02Admite los separadores habituales

Sustituye cada guion por [-. ]?: un guion, un punto o un espacio, y el ? lo hace opcional para que también valgan los dígitos seguidos.

Coincidencias7/7 como se esperaba
/^\d{3}[-. ]?\d{3}[-. ]?\d{4}$/

Debe coincidir4/4

  • 555-123-4567
  • 555.123.4567
  • 555 123 4567
  • 5551234567

No debe3/3

  • 555-1234
  • 55-123-4567
  • 555-123-456
Pruébalo en la Zona de pruebas
Guiones, puntos, espacios o nada. Los dígitos tienen que seguir siendo exactamente 3, 3 y 4.

Un efecto secundario: cada separador se elige por su cuenta, así que 555-123.4567 también pasa. Normalmente no hace daño. Si quieres que los dos separadores sean iguales, captura el primero y repítelo con una referencia inversa (backreference; hay más en nuestra guía de referencias inversas):

Coincidencias4/4 como se esperaba
/^\d{3}([-. ]?)\d{3}\1\d{4}$/

Debe coincidir2/2

  • 555-123-4567
  • 5551234567

No debe2/2

  • 555-123.4567
  • 555 123-4567
Pruébalo en la Zona de pruebas
([-. ]?) captura el separador que se haya usado, aunque sea vacío, y \1 exige el mismo otra vez.

03Paréntesis alrededor del código de área

La solución tentadora para (555) 123-4567 es hacer opcional cada paréntesis con \(? y \)?. Eso acepta entradas desequilibradas:

Coincidencias3/3 como se esperaba
/^\(?\d{3}\)?[-. ]?\d{3}[-. ]?\d{4}$/
  • (555) 123-4567
  • (555-123-4567
  • 555) 123-4567
Pruébalo en la Zona de pruebas
Cada paréntesis es opcional por su cuenta, así que un ( o un ) suelto se cuela.

La alternancia lo arregla. O el código de área va entre paréntesis (con un espacio opcional detrás), o va solo (con un separador opcional detrás):

Coincidencias6/6 como se esperaba
/^(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$/

Debe coincidir4/4

  • (555) 123-4567
  • (555)123-4567
  • 555-123-4567
  • 555.123.4567

No debe2/2

  • (555-123-4567
  • 555) 123-4567
Pruébalo en la Zona de pruebas
Dos ramas para el código de área. Un ( sin su ) no coincide con ninguna de las dos.

04El +1 opcional

El código de país de EE. UU. es 1, y se escribe +1, 1 o se omite por completo. Mételo en un grupo opcional al principio:

Coincidencias7/7 como se esperaba
/^(\+?1[-. ]?)?(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$/

Debe coincidir5/5

  • +1 555 123 4567
  • 1-555-123-4567
  • +1 (555) 123-4567
  • 15551234567
  • 555-123-4567

No debe2/2

  • +44 20 7946 0958
  • 555-1234
Pruébalo en la Zona de pruebas
(\+?1[-. ]?)? es un más opcional, un 1 y un separador opcional. Todo el grupo se puede omitir.

Es un patrón sólido para un formulario solo para EE. UU.

05Afínalo con las reglas de los códigos de área

Los códigos de área y los prefijos de central reales de EE. UU. (los tres dígitos del medio) nunca empiezan por 0 ni por 1. Cambiar \d{3} por [2-9]\d{2} en esas dos posiciones rechaza el clásico número falso:

Coincidencias5/5 como se esperaba
/^[2-9]\d{2}[-. ]?[2-9]\d{2}[-. ]?\d{4}$/

Debe coincidir2/2

  • 212-555-0199
  • 415.555.2671

No debe3/3

  • 123-456-7890
  • 555-012-3456
  • 555-123-4567
Pruébalo en la Zona de pruebas
123-456-7890 queda fuera porque su código de área empieza por 1. Los dos últimos tienen prefijos que empiezan por 0 y por 1, y eso incluye el ejemplo que hemos usado todo este tiempo.

Si merece la pena depende de tus usuarios. Detecta algunas erratas, y también hace el patrón más difícil de leer.

06Números internacionales: E.164

Fuera de EE. UU., los formatos varían demasiado para un solo patrón. En lugar de intentarlo, la mayoría de los sistemas guardan los números en E.164, el estándar internacional: un +, el código de país y luego el número, sin espacios ni puntuación y con 15 dígitos como máximo. Los códigos de país nunca empiezan por 0.

Coincidencias7/7 como se esperaba
/^\+[1-9]\d{1,14}$/

Debe coincidir3/3

  • +15551234567
  • +442079460958
  • +8613800138000

No debe4/4

  • 5551234567
  • +1 555 123 4567
  • +0123456789
  • +1234567890123456
Pruébalo en la Zona de pruebas
Un más, un primer dígito que no sea cero y luego hasta 14 dígitos más. Sin espacios, guiones ni paréntesis.

Lo habitual es dejar que la gente escriba su número como quiera, quitar la puntuación y luego comprobar el resultado. Una regex es perfecta para el paso de limpieza:

Patrón8 car.
/[\s().-]/
Pruébalo en la Zona de pruebas
Cualquier espacio, paréntesis, punto o guion. Sustituye cada coincidencia por nada para convertir “+1 (555) 123-4567” en “+15551234567”.

En Python es re.sub(r"[\s().-]", "", number). En JavaScript, number.replace(/[\s().-]/g, "").

07Lo que una regex no puede decirte

^\+[1-9]\d{1,14}$ comprueba la forma. No puede decirte:

  • si el código de país existe (+999 no existe, y el patrón lo acepta),
  • si la longitud es la correcta para ese país (los números de Reino Unido y los de Alemania tienen longitudes distintas, y algunos países mezclan longitudes),
  • si el número es un móvil, un fijo o no está asignado,
  • si alguien contesta.

Para validar de verdad, usa libphonenumber, la biblioteca de números de teléfono de Google. Conoce el plan de numeración de todos los países y tiene versiones para la mayoría de los lenguajes: phonenumbers en Python y libphonenumber-js en JavaScript. Además formatea los números para mostrarlos y los convierte a E.164 para guardarlos:

import phonenumbers

n = phonenumbers.parse("(212) 555-0199", "US")
phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)  # '+12125550199'
phonenumbers.is_possible_number(n)  # True: the length fits the US plan

Y como pasa con las direcciones de email, la única forma de demostrar que un número funciona es enviarle un código.

08Pruébalo

Aquí tienes un tablero de números de teléfono en formatos mezclados. No hace falta comprobar cada formato por separado. Todos los monstruos tienen diez dígitos seguidos (sin contar la puntuación), y ningún inocente los tiene:

Caza jugablepar 11

Atrapa los números de teléfono completos de EE. UU. y deja libres los cortos.

Objetivos · 0/5 atrapados

  • 555-123-4567objetivo
  • (555) 123-4567objetivo
  • 555.123.4567objetivo
  • 5551234567objetivo
  • +1 555 123 4567objetivo

Inocentes · 0 errores

  • 555-1234inocente
  • 12345-6789inocente
  • 2026-10-12inocente
  • 555-123-456inocente
  • 911inocente

Escribe una regex: el tablero se actualiza mientras escribes.

Pruébalo en la Zona de pruebas
¿Te gustó? Cada día llega una nueva.Jugar la caza de hoy

09Lista de comprobación

  • Para entradas solo de EE. UU., ^(\+?1[-. ]?)?(\(\d{3}\) ?|\d{3}[-. ]?)\d{3}[-. ]?\d{4}$ cubre los formatos habituales.
  • Usa alternancia, no dos paréntesis opcionales, para que ( y ) vayan siempre en pareja.
  • Para números internacionales, quita la puntuación con [\s().-] y guarda en E.164.
  • Comprueba la forma con ^\+[1-9]\d{1,14}$, y usa libphonenumber cuando importe.
  • Envía un código si necesitas saber que el número es real.

10Sigue practicando