En PC Resumen vamos a hablar de las classes Pattern y Matcher. Java proporciona también otras clases en el paquete java.util.regex que ayudan a los desarrolladores a manipular expresiones regulares. La clase Pattern representa una expresión regular. La clase Matcher contiene tanto un patrón de expresión regular como un objeto CharSequence en el que se buscará el patrón. CharSequence es una interfaz que permite el acceso de lectura a una secuencia de caracteres. Tanto String como StringBuilder implementan esta interfaz y por tanto se pueden utilizarse con la clase Matcher.
Una expresión regular puede compararse con un objeto de cualquier clase que implemente CharSequence, pero la expresión regular debe ser un objeto String. Si se intenta crear una expresión regular con un objeto StringBuilder se produce un error.
Si se debe utilizar una expresión regular sólo una vez, puede utilizarse el método estático matches de la clase Pattern. Este método toma una cadena que especifica la expresión regular y un objeto CharSequence donde se realizará la búsqueda. Este método vuelve un booleano que especifica si existe concordancia.
Si se debe utilizar la expresión regular más de una vez, es más eficiente utilizar el método estático compile de la misma clase para crear un objeto Pattern específico de ésta expresión regular. Este método recibe una cadena que representa el patrón y devuelve un nuevo objeto que puede utilizarse para llamar en el método matcher. Este método recibe un objeto CharSequence en el que se realizará la búsqueda, y devuelve un objeto Matcher. La clase Matcher cuenta con el método matches que realiza la misma tarea que pero el método de Pattern no recibe argumentos; el patrón y el objeto de búsqueda están encapsulados en el mismo objeto. Esta clase tiene muchos más métodos que permiten trabajar con expresiones regulares.
En el siguiente programa vemos un ejemplo sencillo que utiliza expresiones regulares. Este programa compara las fechas de cumpleaños con una expresión regular. La expresión sólo concuerda con los cumpleaños que no sean del mes de abril y que pertenezcan a personas cuyo nombre no comienza por ‘J’ (en este ejemplo no se está controlando la entrada de datos erróneos).
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ConcordancesRegex {
public static void main(String args[]) {
Pattern expresion = Pattern.compile("J.*\\d\\d-\\d[0-35-9]-\\d\\d");
String cadena1 = "Joan nació el 05-12-75\n" +
"David nació el 11-04-68\n" +
"Jaume nació el 04-84-73\n" +
"Júlia nació el 17-12-77";
// compara la expresión regular con la cadena e imprime las concordancias
Matcher matcher = expresion.matcher(cadena1);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
En el programa utilizamos un bucle para iterar a través de la cadena. Se utiliza el método find para tratar de que concuerde un pedazo del objeto de búsqueda con el patrón. Cada una de estos llamamientos comienza en el punto en el que ha terminado el anterior. El método group devuelve la cadena del objeto de búsqueda que concuerda con el patrón. La cadena vuelta será la que haya concordar el último golpe de la llamada a find.
El método lokingAt funciona prácticamente igual que find sólo que siempre comienza desde el principio y por tanto siempre encontrará la primera concordancia, si es que hay más de una.