2010-05-28 27 views
7

È possibile utilizzare un'espressione regolare per ottenere nomi file per i file che corrispondono a un determinato modello in una directory senza dover eseguire manualmente il ciclo di tutti i file.Regex per i file in una directory

risposta

25

si potrebbe utilizzare File.listFiles(FileFilter):.

public static File[] listFilesMatching(File root, String regex) { 
    if(!root.isDirectory()) { 
     throw new IllegalArgumentException(root+" is no directory."); 
    } 
    final Pattern p = Pattern.compile(regex); // careful: could also throw an exception! 
    return root.listFiles(new FileFilter(){ 
     @Override 
     public boolean accept(File file) { 
      return p.matcher(file.getName()).matches(); 
     } 
    }); 
} 

EDIT

Così, per abbinare i file che assomigliano: TXT-20100505-XXXX.trx dove XXXX può essere qualsiasi quattro cifre successive, fare qualcosa di simile:

listFilesMatching(new File("/some/path"), "XT-20100505-\\d{4}\\.trx") 
+0

Ho file nel formato TXT-20100505-0000.trx dove * 0000 * stanno cambiando i numeri. TXT-20100525 - * \. Trx non valuta. come potrei ottenere tali file? – n002213f

+0

Digitate in modo errato 'TXT-201005525 -. * \. Trx'? Lo schema che hai scritto corrisponderà a zero o più '-' seguiti da' .trx'. – msw

+0

grazie msw, non avevo digitato male, la mia comprensione è stata ottenere tutti i file con prefisso 'TXT-20100525' seguito da qualsiasi carattere poi' .trx'. Qual è il motivo o la ragione per avere l'extra '.' before' * \\ ' – n002213f

1

implementare FileFilter (solo richiede l'override del metodo

public boolean accept(File f) 

allora, ogni volta che si richiede l'elenco dei file, JVM confrontare ciascun file contro il vostro metodo. Regex non può e non deve essere utilizzato come Java è un linguaggio multipiattaforma e che causerebbe implicazioni su sistemi diversi

+2

dubito la validità dell'ultima frase, perché dovrebbe essere? – n002213f

+2

Regex è standard in tutte le versioni di Java, indipendentemente dal sistema operativo, non importa se lo si utilizza. –

+0

per favore dimmi come distinguere tra file e directory su unix e windows con una singola regex? Ho capito che la domanda era "ottenere nomi di file per i file che corrispondono a un determinato pattern". Questo mi ricorda di scrivere Javascript che supporta alcuni browser contemporaneamente ... –

0
package regularexpression; 

import java.io.File; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegularFile { 
    public static void main(String[] args) { 
     new RegularFile(); 
    } 

    public RegularFile() { 

     String fileName = null; 
     boolean bName = false; 
     int iCount = 0; 
     File dir = new File("C:/regularfolder"); 
     File[] files = dir.listFiles(); 
     System.out.println("List Of Files ::"); 

     for (File f : files) { 

      fileName = f.getName(); 
      System.out.println(fileName); 

      Pattern uName = Pattern.compile(".*l.zip.*"); 
      Matcher mUname = uName.matcher(fileName); 
      bName = mUname.matches(); 
      if (bName) { 
       iCount++; 

      } 
     } 
     System.out.println("File Count In Folder ::" + iCount); 

    } 
} 
+1

utilizzando questo codice possiamo filtrare i file dalla cartella usando le classi pattern e matcher. – hanisa

+0

Penso che dovresti anche scappare dal carattere punto prima di ".zip" in "\\. Zip" – Nap

Problemi correlati