2010-05-28 7 views
7

Est-il possible d'utiliser une expression régulière pour obtenir des noms de fichiers pour des fichiers correspondant à un modèle donné dans un répertoire sans avoir à parcourir manuellement tous les fichiers.Regex pour les fichiers dans un répertoire

Répondre

25

Vous pouvez utiliser 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

Donc, pour correspondre à des fichiers qui ressemblent à: TXT-20100505-XXXX.trxXXXX peut y avoir quatre chiffres successifs, faire quelque chose comme ceci:

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

J'ai des fichiers au format TXT-20100505-0000.trx où * 0000 * changent de numéros. TXT-20100525 - * \. Trx n'évalue pas. Comment pourrais-je obtenir de tels fichiers? – n002213f

+0

Avez-vous mis-taper 'TXT-201005525 -. * \. Trx'? Le modèle que vous avez écrit correspondra à zéro ou plus '-' suivi de' .trx'. – msw

+0

merci msw, je n'avais pas mal tapé, ma compréhension était obtenir tous les fichiers avec le préfixe 'TXT-20100525' suivi de tous les caractères puis' .trx'. Quel est l'importance ou la raison pour avoir le supplément '.' avant' * \\ ' – n002213f

1

mettre en œuvre FileFilter (juste exige que vous substituez la méthode

public boolean accept(File f) 

alors, chaque fois que vous demandez la liste des fichiers, jvm comparera chaque fichier sur votre méthode. Regex ne peut pas et ne devrait pas être utilisé comme java est un langage multi-plateforme et qui entraînerait des conséquences sur les systèmes différents

+2

je doute la validité de la dernière phrase, pourquoi cela serait-il? – n002213f

+2

Regex est standard sur toutes les versions de Java, quel que soit le système d'exploitation, peu importe si vous l'utilisez. –

+0

alors s'il vous plaît dites-moi comment distingueriez-vous les fichiers et les répertoires sous Unix et Windows avec une seule regex? J'ai compris que la question était "d'obtenir des noms de fichiers pour les fichiers correspondant à un modèle donné". Cela me rappelle d'écrire Javascript qui prend en charge quelques navigateurs à la fois ... –

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

en utilisant ce code, nous pouvons filtrer les fichiers du dossier en utilisant des classes de modèle et de matcher. – hanisa

+0

Je pense que vous devriez également échapper le caractère point avant le ". Zip" à "\\. Zip" – Nap

Questions connexes