A partir del JDK 1.4 se incluye el paquete java.util.regexp para hacer uso de expresiones regulares en Java. El paquete está formado por dos clases, que explicaré a continuación, la clase Matcher y la clase Pattern y por una excepción, PatternSyntaxException.

Una expresión regular es un patrón que describe a un string. Recuerdo, que sin saberlo, escribía mis primeras primeras expresiones regulares en DOS, dir *.bmp, o del *.tmp o con en SQL "nombre Like '*ma*'" donde el asterisco significa cualquier representa cualquier secuencia de caracteres.
En Java:
Veamos un ejemplo comentado para entender su comportamiento:
public class Test {
public static void main(String[] args) {
String input = "www.pepë@mail.com";
// comprueba que no empieze por punto o @
/*
* El caracter '\' sirve preceder a expresiones con valores de escape, así \\ equivale a \ o \{ equivale a {
* El caracter '^' indica comienzo de una línea
* El caracter '|' representa un O lógico
*/
Pattern p = Pattern.compile("^\\.|^\\@");
Matcher m = p.matcher(input);
if ( m.find() )
System.err.println("Las direcciones email no empiezan por punto o @");
//comprueba que no empieze por www.
p = Pattern.compile("^www\\.");
m = p.matcher(input);
if (m.find())
System.out.println("Los emails no empiezan por www");
// comprueba que contenga @
p = Pattern.compile("\\@");
m = p.matcher(input);
if (!m.find())
System.out.println("La cadena no tiene arroba");
//Comprueba que no contenga caracteres prohibidos
/*
* El caracter '+' representa una o más veces
* El caracter '^' dentro de los corchetes es un NOT, permite encontrar cualquier carácter que NO se encuentre dentro del grupo indicado
*/
p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean resultado = m.find();
boolean caracteresIlegales = false;
while(resultado) {
caracteresIlegales = true;
m.appendReplacement(sb, "");
resultado = m.find();
}
// Añade el ultimo segmento de la entrada a la cadena
m.appendTail(sb);
input = sb.toString();
if (caracteresIlegales) {
System.out.println("La cadena contenía caracteres ilegales que han sido suprimidos");
}
System.out.println("Email: " + input);
}
}
Para finalizar y como referencia, la siguiente tabla resume el significado de los carateres especiales utilizados para la construcción de expresiones regulares. Tener en cuenta que una expresión regular sólo puede contener (aparte de letras y números) los siguientes caracteres: < \$, ^, ., *, +, ?, [, ], \. >
Lógicos:
Intervalos de caracteres:
Intervalos de caracteres predefinidos:
Caracteres:
Limites:
Cuantificadores:
Basado en Expresiones Regulares en Java
Suscribete al feed aquí
4 Respuestas para "Expresiones regulares en Java"
stoy echando un ojillo a tu blog, muy interesante por cierto.
Te escribo porque tengo un problemilla que no soy capaz de resolver. Te explico la situación, creo que es interesante y seguro que ayuda a más de uno.
Tengo un String que he sacado previamente de un Fichero y tengo que encontrar las estructuras que siguen el siguiente formato para hacer una modificación:
“text1:=text2.text3″ (pat=Pattern.compile(”[a-zA-Z_0-9]+\\:\\=[a-zA-Z_0-9]+\\.[a-zA-Z_0-9]+”); )
En el String puede haber otras estructuras similares como por ejemplo “text1:=text2″ pero estas no deberían verse afectadas.
La idea, que es lo que no soy capaz de conseguir es que una vez tengamos localizadas las cadenas que cumplen el patrón que se ha definido (pat) tendría que substituir el := por un ::= dejando el resto de la cadena tal y como está y sin que las otras cadenas parecidas se vean afectadas.
Espero haberme expresado con la suficiente claridad para que me puedas echar una manita porque estoy atascadísimo!!!
Muchas gracias!!!!
Bueno…. parece que finalmente lo hemos conseguido!
La solución consiste en asignar variables a las partes del Patrón que no queremos cambiar.
Una variable se asigna poniendo entre parentesis la parte del patrón que queremos guardar.
De esta manera podemos modificar unicamente parte del patron localizado dejando otra parte sin tocar.
El problema me surgió haciendo un conversor de lenguaje de programación en el que los simbolos de asignación son distintos en el lenguaje origen (:= ) y en el lenguaje destino (::=) para el caso de acceso a un campo en concreto de la variable.
Veamos un ejemplo:
Matcher mat=null;
Pattern pat=null;
// Buscamos un patrón del tipo text1:=text2.text3 pat=Pattern.compile(”([a-zA-Z_0-9]+)\\:\\=([a-zA-Z_0-9]+)\\.([a-zA-Z_0-9]+)”);
// Así como vemos tenemos 3 variables
mat = pat.matcher(initialString);
String finalString = mat.replaceAll(”$1::=$2.$3″);
El resultado final seria text1::=text2.text3.
Espero que esto os pueda servir de ayuda.
Espero que haya quedado claro.
Excelente aporte! Muchas gracias.
Saludos.
[...] Una vez que ha ingresado todos los datos, donde lo ideal es hacerlo con expresiones regulares [...]
Comentarios: