Expresiones regulares en Java: guía completa con ejemplos de código
Las expresiones regulares (regex) son una herramienta poderosa para buscar, extraer y reemplazar texto según un patrón. En Java, el trabajo con expresiones regulares se implementa a través de dos clases principales: java.util.regex.Pattern (compilación del patrón) y java.util.regex.Matcher (ejecución de la búsqueda). En este artículo analizaremos la sintaxis, los métodos principales y veremos ejemplos prácticos que le ayudarán a usar regex con confianza en proyectos reales.
1. Fundamentos del trabajo con expresiones regulares en Java
Antes de pasar a los ejemplos, analicemos las clases clave y su interacción.
Clase Pattern
Pattern es una representación compilada de la expresión regular. Se crea mediante el método estático Pattern.compile(). Sin compilación no es posible usar regex.
Clase Matcher
Matcher es el "motor" que realiza la búsqueda según el patrón dado en una cadena. Se crea mediante el método pattern.matcher(inputString).
Sintaxis básica de metacaracteres
.— cualquier carácter (excepto salto de línea)\\d— dígito (0-9)\\w— letra, dígito o guion bajo\\s— carácter de espacio en blanco^— inicio de la cadena$— fin de la cadena*— 0 o más repeticiones+— 1 o más repeticiones?— 0 o 1 repetición{n,m}— de n a m repeticiones[]— conjunto de caracteres (por ejemplo,[a-z]— cualquier letra minúscula)()— grupo de captura
Ejemplo 1: Validación simple de número de teléfono
import java.util.regex.*;
public class PhoneValidator { public static void main(String[] args) { String phone = "+7 (999) 123-45-67"; String regex = "^\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(phone); if (matcher.matches()) { System.out.println("Número correcto"); } else { System.out.println("El número no coincide con el formato"); } }}2. Métodos de Matcher: matches(), find() y grupo de captura
Comprender la diferencia entre matches() y find() es clave para trabajar exitosamente con regex en Java.
matches()— verifica si toda la cadena coincide completamente con el patrón (agrega implícitamente^y$).find()— busca una subcadena que coincida con el patrón en cualquier lugar de la cadena.group()— devuelve la coincidencia encontrada o el valor del grupo de captura.
Ejemplo 2: Extracción de direcciones de email de un texto usando find() y grupos
import java.util.regex.*;
public class EmailExtractor { public static void main(String[] args) { String text = "Contactos: support@example.com, info@test.org y admin@site.net."; String regex = "([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\\\\.([a-zA-Z]{2,})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("Email completo: " + matcher.group()); System.out.println("Nombre de usuario: " + matcher.group(1)); System.out.println("Dominio: " + matcher.group(2)); System.out.println("Zona: " + matcher.group(3)); System.out.println("---"); } }}Ejemplo 3: Validación de contraseña con matches()
Requisitos: de 8 a 20 caracteres, al menos una letra mayúscula, al