Estoy tratando de armar un regex completo para validar números de teléfono. Lo ideal es que maneje los formatos internacionales, pero debe manejar los formatos de Estados Unidos, incluyendo los siguientes:
Voy a responder con mi intento actual, pero espero que alguien tenga algo mejor y/o más elegante.
Resulta que hay una especie de especificación para esto, al menos para Norteamérica, llamada NANP.
Hay que especificar exactamente lo que se quiere. ¿Cuáles son los delimitadores legales? ¿Espacios, guiones y puntos? ¿No se permite ningún delimitador? ¿Se pueden mezclar delimitadores (por ejemplo, +0.111-222.3333)? ¿Cómo se van a tratar las extensiones (por ejemplo, 111-222-3333 x 44444)? ¿Qué pasa con los números especiales, como el 911? ¿El código de área será opcional u obligatorio?
Aquí hay una regex para un número de 7 o 10 dígitos, con extensiones permitidas, los delimitadores son espacios, guiones o puntos:
^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$
¿Has echado un vistazo a RegExLib?
Al introducir el número de teléfono de EE.UU. se obtiene una lista de posibilidades.
Aquí está mi mejor intento hasta ahora. Maneja los formatos anteriores, pero estoy seguro de que me faltan algunos otros formatos posibles.
^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$