Expresiones regulares en Java: desde lo básico hasta el uso avanzado
Las expresiones regulares (regex) son una herramienta poderosa para trabajar con texto, que permite realizar búsqueda, reemplazo y validación de cadenas según patrones complejos. En Java, el soporte para expresiones regulares se implementa a través del paquete java.util.regex, que proporciona dos clases principales: Pattern (compila el patrón) y Matcher (realiza operaciones de búsqueda/reemplazo).
En este artículo, analizaremos cómo usar eficazmente las expresiones regulares en Java, comenzando con la sintaxis básica y terminando con ejemplos reales de la práctica de desarrollo.
1. Fundamentos de la sintaxis de expresiones regulares en Java
Antes de pasar al código Java, es importante dominar los metacaracteres básicos de las expresiones regulares:
.— cualquier carácter individual (excepto salto de línea)\\d— cualquier dígito (0-9)\\w— letra, dígito o guion bajo\\s— carácter de espacio en blanco (espacio, tabulación, nueva línea)*— 0 o más repeticiones del carácter anterior+— 1 o más repeticiones?— 0 o 1 repetición (hace que el carácter sea opcional)^— inicio de la cadena$— final de la cadena[...]— clase de caracteres (por ejemplo,[a-z]— todas las letras minúsculas)(...)— grupo de captura
Importante: En Java, las cadenas con expresiones regulares requieren doble escape. Por ejemplo, para usar \\d, en el código escribimos "\\\\d". Esto se debe a que la barra invertida primero es procesada por el compilador de Java y luego se pasa al motor de regex.
2. Clases Pattern y Matcher — base del trabajo con regex en Java
El esquema básico para trabajar con expresiones regulares en Java consta de tres pasos:
- Creación del objeto
Patternmediante la compilación de la cadena del patrón - Creación del objeto
Matcherllamando al métodomatcher()sobre la cadena que se desea verificar - Ejecución de operaciones — búsqueda, coincidencia, reemplazo
Ejemplo 1: Verificación de coincidencia de toda la cadena
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class RegexExample { public static void main(String[] args) { // Verificar si la cadena es una dirección de email válida String email = "user@example.com"; String emailPattern = "^[A-Za-z0-9+_.-]+@(.+)$"; Pattern pattern = Pattern.compile(emailPattern); Matcher matcher = pattern.matcher(email); if (matcher.matches()) { System.out.println("Email es válido"); } else { System.out.println("Email no es válido"); } }}El método matches() intenta hacer coincidir el patrón con toda la cadena completa. Si se necesita verificar si la cadena contiene una coincidencia con el patrón (no necesariamente completa), se utiliza el método find().
Ejemplo 2: Búsqueda de todas las ocurrencias del patrón en la cadena
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class FindExample { public static void main(String[] args) { String text = "Java 8, Java 11, Java 17 — son versiones del lenguaje Java"; String regex = "Java\\\\s+\\\\d+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("Encontrado: " + matcher.group() + " (posición: " + matcher.start() + "-" + matcher.end() + ")"); } }}Resultado de la ejecución:
Encontrado: Java 8 (posición: 0-6)Encontrado: Java 11 (posición: 8-15)