La Clase Pattern: (Patrón):
En las expresiones regulares de java la clase Pattern tiene varios métodos que nos sirven para establecer el patrón y buscar coincidencias, veamos:
El error mas común es: “Invalid escape sequence”.
Ejemplo:
Pattern patron = Pattern.compile("\w*");
Este código lanza un error ya que se deben colocar una barra invertida adicional para que la expresión \w tome efecto de la siguiente manera:
Pattern patron = Pattern.compile("\\w*");
Ahora si nuestro patrón está compilado y listo para usarse en cualquier parte del código, en este caso coincidirá con cualquier palabra que use sólo letras y/o números.
Ejemplo:
System.out.println(Pattern.matches("\\w*","cadena2")); //Consola muestra true
Pattern patron = Pattern.compile("\\s*palabra");
Matcher m = patron.matcher("\t\t palabra");
if(m.matches()){
System.out.println("Patron coincide");
}else{
System.out.println("Patron No coincide");
}//Imprime Patron coincide
Pattern patron = Pattern.compile("\\s*palabra");
System.out.println(patron.pattern());
//Se imprime \s*palabra
String[] split(CharSequence entrada, int limite)
Pattern patron = Pattern.compile("\\s*palabra");
String[] cadenas = patron.split("uno palabra dos");
for(String fragmento: cadenas){
System.out.print(fragmento.trim()+" ");
}
//Imprime uno dos
La variante con límite, tiene tres modalidades, si límite es un entero positivo se aplicará al menos el límite menos 1 veces; si es cero, se aplicara tantas veces como se pueda eliminándose las cadenas vacías y por último
si es negativo es igual a cero pero se dejan las cadenas vacías.
A continuación un código que utiliza las expresiones regulares para mostrar todas las clases que se encuentran dentro de un archivo java siempre y cuando la clase no extienda de ninguna clase y no implemente interfaces. La clase se llama Buscadora y cuando se va a utilizar hay que pasar como parámetro el archivo de clase al que se le quiere encontrar todas sus clases. Por ejemplo: java Buscadora ClaseDestino.java Aqui el codigo: import java.io.*; import java.util.regex.*; import javax.swing.JOptionPane; public class Buscadora { public static void main(String[] args) { BufferedReader entrada = null; String texto = ""; String[] cadenas = null; Matcher m = null; Pattern patronBusqueda = Pattern.compile("\\s*\\w*\\s*\\w*\\s*class\\s*\\w*\\s*\\W*"); Pattern patronSplit = Pattern.compile("\\s*\\w*\\s*\\w*\\s*class"); try { File archivo = new File(args[0]); FileReader fr = new FileReader(archivo); entrada = new BufferedReader(fr); System.out.println(args[0]); while((texto = entrada.readLine()) != null){ m = patronBusqueda.matcher(texto); if(m.matches()){ cadenas = patronSplit.split(texto,0); for(String cadena: cadenas){ cadena = cadena.replace("{", " "); cadena = cadena.replace("}", " "); if(cadena.trim().length() == 0) continue; System.out.println("Nombre de la clase: "+cadena.trim()); } } } } catch (ArrayIndexOutOfBoundsException e) { JOptionPane.showMessageDialog(null, "Debe especificar un archivo como paramentro"); } catch (FileNotFoundException e) { JOptionPane.showMessageDialog(null, "Error. Archivo no encontrado"); } catch (IOException e){ JOptionPane.showMessageDialog(null, "Error al leer archivo"); } } } Como puede ver se utilizan dos patrones, uno para verificar que la línea que se compara coincida con una linea de declaración de una clase y el otro patrón para romper la cadena (split) y obtener así el nombre de la clase. También es importante mencionar que el primer patrón (patronBusqueda) utiliza el metacaracter \W para hacerla coincidir con un caracter de no palabra, en este caso puede ser una llave "{" o "}". Otros utilizados son los caracteres de palabra \w y de espacio en blanco o tabulador \s. |
No hay comentarios:
Publicar un comentario