2010-06-16 37 views
8

que necesito para implementarnombres de archivos java patrón de filtro

File[] files = getFiles(String folderName, String ptrn); 

Dónde PTRN es un modelo del estilo del símbolo del sistema como "* 2010 * .txt"

estoy familiarizado con la clase FilenameFilter, pero no puede implementar public boolean accept(File dir, String filename) porque String.matches() no acepta tales patrones.

Gracias!

+0

¿Qué otros patrones se necesita para apoyar? – OscarRyz

Respuesta

14

El String#matches() acepta regular expressionpatterns.

La variante regex de la variante "laico" *2010*.txt sería .*2010.*\.txt.

Así que el siguiente debería funcionar:

public boolean accept(File dir, String name) { 
    return name.matches(".*2010.*\\.txt"); 
} 

La doble barra invertida está ahí para representar una barra inversa real, porque la barra invertida en sí es un carácter de escape en Java de String.

Como alternativa, también puede hacerlo sin expresiones regulares usando los otros String métodos:

public boolean accept(File dir, String name) { 
    return name.contains("2010") && name.endsWith(".txt"); 
} 

Su mejor apuesta es probable que deje ptrn representan un verdadero patrón de expresión o cadena de reemplazar cada . con \. y * con .* para que se convierta en un patrón de expresiones regulares válido.

public boolean accept(File dir, String name) { 
    return name.matches(ptrn.replace(".", "\\.").replace("*", ".*")); 
} 
+0

Gracias. No sé cuál sería el patrón de entrada. No es constante. Pero según su ejemplo veo que lo siguiente convierte los patrones: str.replace (".", "\\."). Replace ("*", ". *") – Serg

+0

esto es insuficiente; si la cadena contiene caracteres que tienen significado en una expresión regular, no se escapan. (cubrió el carácter 'punto' pero hay otros) –

2

Es posible que necesite escapar de sus comodines específicos para los que se utilizan en Java regex.

Por ejemplo, para cambiar "*" se podría utilizar algo como:

import java.io.*; 

class Filter { 
    public static void main (String [] args) { 
     String argPattern = args[0]; 

     final String pattern = argPattern.replace(".","\\.").replace("*",".*"); 
     System.out.println("transformed pattern = " + pattern); 
     for(File f : new File(".").listFiles(new FilenameFilter(){ 
          public boolean accept(File dir, String name) { 
           return name.matches(pattern); 
          } 
         })){ 
      System.out.println(f.getName()); 
     } 
    } 
} 


$ls -l *ter.* 
-rw-r--r-- 1 oscarreyes staff 1083 Jun 16 17:55 Filter.class 
-rw-r--r-- 1 oscarreyes staff 616 Jun 16 17:56 Filter.java 
$java Filter "*ter.*" 
transformed pattern = .*ter\..* 
Filter.class 
Filter.java 
+0

esto es insuficiente; si la cadena contiene caracteres que tienen significado en una expresión regular, no se escapan. –

+0

(más notablemente "." Coincide con * cualquier * carácter) –

Cuestiones relacionadas