2010-06-16 6 views
8

Ijava Dateinamen Filtermuster

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

Wo PTRN ist eine Eingabeaufforderung Stilmuster wie "* 2010 * .txt"

Ich bin vertraut mit Filename Klasse implementieren müssen, kann aber nicht Implementieren Sie public boolean accept(File dir, String filename) , da String.matches() solche Muster nicht akzeptiert.

Danke!

+0

Welche anderen Muster benötigen Sie zu unterstützen:

Zum Beispiel ersetzen „*“ Sie so etwas wie verwenden könnte? – OscarRyz

Antwort

14

Die String#matches() akzeptiert regular expressionpatterns. Die Regex-Variante der Variante "Laien" *2010*.txt wäre .*2010.*\.txt.

So sollten folgende Arbeiten:

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

Der doppelte Schrägstrich nur gibt es einen tatsächlichen Backslash darstellen, da der Backslash selbst String ein Escape-Zeichen in Java ist.

Alternativ können Sie auch tun, ohne regex die anderen String Methoden verwenden:

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

Ihre beste Wette wahrscheinlich ist ptrn ein echten Muster regex darstellen zu lassen oder auf schnur ersetzt jeden . mit \. und * mit .*, so dass es ein gültiges Regex-Muster wird.

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

Danke. Ich weiß nicht, was das Eingabemuster wäre. Es ist nicht konstant. Aber basierend auf Ihrem Beispiel sehe ich, dass die folgenden Konvertierungen die Muster: str.replace (".", "\\."). Ersetzen ("*", ". *") – Serg

+0

das ist nicht ausreichend; Wenn die Zeichenfolge Zeichen enthält, die in einer Regex Bedeutung haben, werden sie nicht maskiert. (Sie haben den 'Punkt' Charakter abgedeckt aber es gibt andere) –

2

Möglicherweise müssen Sie Ihre spezifischen Joker für die in Java Regex verwendeten Joker erstellen.

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

das ist nicht ausreichend; Wenn die Zeichenfolge Zeichen enthält, die in einer Regex Bedeutung haben, werden sie nicht maskiert. –

+0

(am bemerkenswertesten "." Entspricht * jedem * Zeichen) –