Validar números de teléfono con Java Regex

1. Información general

A veces, necesitamos validar el texto para asegurarnos de que su contenido cumpla con algún formato. En este tutorial rápido, veremos cómo validar diferentes formatos de números de teléfono usando expresiones regulares.

2. Expresiones regulares para validar números de teléfono

2.1. Número de diez dígitos

Comencemos con una expresión simple que verificará si el número tiene diez dígitos y nada más :

@Test public void whenMatchesTenDigitsNumber_thenCorrect() { Pattern pattern = Pattern.compile("^\\d{10}$"); Matcher matcher = pattern.matcher("2055550125"); assertTrue(matcher.matches()); }

Esta expresión permitirá números como 2055550125 .

2.2. Número con espacios en blanco, puntos o guiones

En el segundo ejemplo, veamos cómo podemos permitir espacios en blanco, puntos o guiones (-) opcionales entre los números:

@Test public void whenMatchesTenDigitsNumberWhitespacesDotHyphen_thenCorrect() { Pattern pattern = Pattern.compile("^(\\d{3}[- .]?){2}\\d{4}$"); Matcher matcher = pattern.matcher("202 555 0125"); assertTrue(matcher.matches()); }

Para lograr este objetivo adicional (espacios en blanco o guión opcionales), simplemente agregamos los caracteres:

  • [-.]?

Este patrón permitirá números como 2055550125 , 202555 0125 , 202.555.0125 y 202-555-0125 .

2.3. Número entre paréntesis

A continuación, agreguemos la posibilidad de tener la primera parte de nuestro teléfono entre paréntesis :

@Test public void whenMatchesTenDigitsNumberParenthesis_thenCorrect() { Pattern pattern = Pattern.compile"^((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"); Matcher matcher = pattern.matcher("(202) 555-0125"); assertTrue(matcher.matches()); }

Para permitir el paréntesis opcional en el número, hemos agregado los siguientes caracteres a nuestra expresión regular:

  • (\\ (\\ d {3} \\)) | \\ d {3})

Esta expresión permitirá números como (202) 5550125 , (202) 555-0125 o (202) -555-0125 . Además, esta expresión también permitirá los números de teléfono cubiertos en el ejemplo anterior.

2.4. Número con prefijo internacional

Finalmente, veamos cómo permitir un prefijo internacional al comienzo de un número de teléfono :

@Test public void whenMatchesTenDigitsNumberPrefix_thenCorrect() { Pattern pattern = Pattern.compile("^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$"); Matcher matcher = pattern.matcher("+111 (202) 555-0125"); assertTrue(matcher.matches()); } 

Para permitir el prefijo en nuestro número, hemos agregado al comienzo de nuestro patrón los caracteres:

  • (\\ + \\ d {1,3} ()?)?

Esta expresión permitirá que los números de teléfono incluyan prefijos internacionales, teniendo en cuenta que los prefijos internacionales son normalmente números con un máximo de tres dígitos.

3. Aplicar varias expresiones regulares

Como hemos visto, un número de teléfono válido puede adoptar varios formatos diferentes. Por lo tanto, es posible que deseemos verificar si nuestro String cumple con alguno de estos formatos.

En la última sección, comenzamos con una expresión simple y agregamos más complejidad para lograr el objetivo de cubrir más de un formato. Sin embargo, a veces no es posible utilizar una sola expresión. En esta sección, veremos cómo unir varias expresiones regulares en una sola .

Si no podemos crear una expresión regular común que pueda validar todos los casos posibles que queremos cubrir, podemos definir diferentes expresiones para cada uno de los casos y luego usarlas todas juntas concateándolas con un símbolo de barra vertical (|).

Veamos un ejemplo donde usamos las siguientes expresiones:

  • La expresión utilizada en la última sección:
    • ^ (\\ + \\ d {1,3} ()?)? ((\\ (\\ d {3} \\)) | \\ d {3}) [-.]? \\ d { 3} [-.]? \\ d {4} $
  • Expresión regular para permitir números como +111 123 456 789:
    • ^ (\\ + \\ d {1,3} ()?)? (\\ d {3} []?) {2} \\ d {3} $
  • Patrón para permitir números como +111 123 45 67 89:
    • ^ (\\ + \\ d {1,3} ()?)? (\\ d {3} []?) (\\ d {2} []?) {2} \\ d {2} $
@Test public void whenMatchesPhoneNumber_thenCorrect() { String patterns = "^(\\+\\d{1,3}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$" + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?){2}\\d{3}$" + "|^(\\+\\d{1,3}( )?)?(\\d{3}[ ]?)(\\d{2}[ ]?){2}\\d{2}$"; String[] validPhoneNumbers = {"2055550125","202 555 0125", "(202) 555-0125", "+111 (202) 555-0125", "636 856 789", "+111 636 856 789", "636 85 67 89", "+111 636 85 67 89"}; Pattern pattern = Pattern.compile(patterns); for(String phoneNumber : validPhoneNumbers) { Matcher matcher = pattern.matcher(phoneNumber); assertTrue(matcher.matches()); } }

Como podemos ver en el ejemplo anterior, al usar el símbolo de la tubería, podemos usar las tres expresiones de una vez, lo que nos permite cubrir más casos que con una sola expresión regular.

4. Conclusión

En este artículo, hemos visto cómo verificar si una cadena contiene un número de teléfono válido usando diferentes expresiones regulares. También hemos aprendido a utilizar varias expresiones regulares al mismo tiempo.

Como siempre, el código fuente completo del artículo está disponible en GitHub.