Clase Pattern de Java

En Java, laPatternclase Pattern es uno de los componentes centrales de la funcionalidad de expresiones regulares; pertenece aljava.util.regexpaquete.

La expresión regular (Regular Expression) es una poderosa herramienta de procesamiento de texto utilizada para hacer coincidir, buscar y reemplazar patrones específicos en cadenas.

PatternLa función principal de la clase es compilar la expresión regular en un patrón (Pattern) para realizar operaciones de coincidencia eficientes posteriormente.


Introducción a las expresiones regulares

Una expresión regular es una sintaxis utilizada para describir patrones de cadenas. Mediante símbolos y reglas específicas, se pueden definir reglas complejas de coincidencia de cadenas. Por ejemplo:

  • \dCoincide con cualquier dígito (equivalente a[0-9])
  • \wCoincide con cualquier letra, dígito o guion bajo (equivalente a[a-zA-Z0-9_])
  • a+Coincide con una o más letras consecutivasa
  • ^Coincide con el inicio de la cadena
  • $Coincide con el final de la cadena

Uso básico de la clase Pattern

Crear objetos Pattern

PatternLa clase no tiene constructor público; debe crearse una instancia mediante el método estáticocompile()para crear una instancia:

Ejemplo

import java.util.regex.Pattern;

// Compilar la expresión regular
Pattern pattern = Pattern.compile("a*b");

Métodos comunes

matcher(CharSequence input)

Crea unMatcherobjeto para realizar operaciones de coincidencia en la cadena de entrada:

Ejemplo

Matcher matcher = pattern.matcher("aaaab");

matches(String regex, CharSequence input)

Método estático que determina directamente si la cadena de entrada coincide completamente con la expresión regular:

Ejemplo

boolean isMatch = Pattern.matches("a*b", "aaaab"); // Devuelve true

split(CharSequence input)

Divide la cadena de entrada según la expresión regular:

Ejemplo

String[] parts = pattern.split("aaaabtest"); // Devuelve ["", "test"]

Banderas de expresiones regulares (Flags)

Al compilar la expresión regular, se pueden especificar diferentes banderas para cambiar el comportamiento de coincidencia:

Bandera Descripción
Pattern.CASE_INSENSITIVE Ignorar mayúsculas y minúsculas
Pattern.MULTILINE Modo multilínea,^y$coincide con el inicio y el final de cada línea
Pattern.DOTALL .coincide con todos los caracteres, incluidos los saltos de línea
Pattern.UNICODE_CASE habilita el plegado de mayúsculas y minúsculas compatible con Unicode

Ejemplo de uso:

Ejemplo

// Coincidencia ignorando mayúsculas y minúsculas
Pattern pattern = Pattern.compile("a*b", Pattern.CASE_INSENSITIVE);

Aplicaciones prácticas de la clase Pattern

Validar formato de correo electrónico

Ejemplo

String emailRegex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
Pattern emailPattern = Pattern.compile(emailRegex);

String email = "[email protected]";
boolean isValid = emailPattern.matcher(email).matches();

Extraer números

Ejemplo

String text = "Price: $123.45";
Pattern numberPattern = Pattern.compile("\\d+\\.?\\d*");
Matcher matcher = numberPattern.matcher(text);

if (matcher.find()) {
    String number = matcher.group(); // "123.45"
}

Reemplazar cadenas

Ejemplo

String input = "Hello, my phone is 123-456-7890";
Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
String output = phonePattern.matcher(input).replaceAll("[PHONE]");
// Salida: "Hello, my phone is [PHONE]"

Consejos de optimización de rendimiento

  1. Precompilar expresiones regulares: Para expresiones regulares que se utilizan varias veces, se deben precompilar enPatternobjetos, en lugar de recompilarlas en cada uso.

  2. Evitar expresiones regulares excesivamente complejas: Las expresiones regulares demasiado complejas pueden causar degradación del rendimiento e incluso el problema de "retroceso catastrófico".

  3. Usar grupos de manera razonable: Los grupos no capturadores(?:...)tienen mejor rendimiento que los grupos capturadores(...); si no se necesita capturar contenido, se deben usar grupos no capturadores.


Resumen

PatternLa clase es el núcleo de la funcionalidad de expresiones regulares en Java y proporciona una potente capacidad de coincidencia de patrones en cadenas. Mediante el uso razonable de laPatternclase y su clase complementariaMatcherse pueden completar eficientemente diversas tareas de procesamiento de cadenas. Dominar el uso de las expresiones regulares y de laPatternclase mejorará enormemente la capacidad de procesamiento de texto de los desarrolladores.

La siguiente tabla enumera losPatternmétodos comunes de la clase:

Métodos de construcción y compilación

Método Descripción
static Pattern compile(String regex) Compila la expresión regular en un objeto Pattern
static Pattern compile(String regex, int flags) Compila la expresión regular con banderas especificadas
static boolean matches(String regex, CharSequence input) Coincide rápidamente con la expresión regular (compilación + coincidencia)
static String quote(String s) Convierte la cadena a modo literal (escapa todos los caracteres especiales)

Constantes de banderas (comunes)

Bandera Descripción
Pattern.CASE_INSENSITIVE Coincidencia sin distinguir entre mayúsculas y minúsculas
Pattern.MULTILINE Modo multilínea (^ y $ coinciden con el inicio y el final de línea)
Pattern.DOTALL El punto (.) coincide con todos los caracteres, incluidos los terminadores de línea
Pattern.UNICODE_CASE Habilita el plegado de mayúsculas y minúsculas compatible con Unicode

Métodos de coincidencia y división

Método Descripción
Matcher matcher(CharSequence input) Crea un objeto Matcher
String[] split(CharSequence input) Divide la cadena de entrada con el patrón
String[] split(CharSequence input, int limit) División con límite de veces
Stream<String> splitAsStream(CharSequence input) Devuelve un flujo (stream) después de la división (Java 8+)

Métodos de información del patrón

Método Descripción
String pattern() Devuelve la expresión regular compilada
int flags() Devuelve las banderas establecidas al compilar
String toString() Devuelve la representación en cadena del patrón
Otras extensiones