2010-05-28 31 views
7

Czy można użyć wyrażenia regularnego, aby uzyskać nazwy plików dla plików pasujących do danego wzorca w katalogu bez konieczności ręcznego przechodzenia przez wszystkie pliki.Regex dla plików w katalogu

Odpowiedz

25

można użyć 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

Tak, aby dopasować pliki, które wyglądają jak: TXT-20100505-XXXX.trx gdzie XXXX może być dowolny cztery kolejne cyfry, zrób coś takiego:

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

Mam pliki w formacie TXT-20100505-0000.trx, gdzie * 0000 * zmienia cyfry. TXT-20100525 - * \. Trx nie ocenia. jak dostanę takie pliki? – n002213f

+0

Czy źle wpisałeś 'TXT-201005525 -. * \. Trx'? Wzór, który wpisałeś, będzie pasował zero lub więcej '-', a następnie' .trx'. – msw

+0

dzięki msw, nie pomyliłem się, zrozumiałem, że wszystkie pliki mają przedrostek 'TXT-20100525', a następnie wszelkie znaki, a następnie' .trx'. Co znaczący lub powód posiadania dodatkowego '.' przed' * \\ ' – n002213f

1

wdrożyć FileFilter (tylko wymaga, aby zastąpić metodę

public boolean accept(File f) 

następnie, za każdym razem, że będziesz zażądać listy plików, jvm będzie porównać każdy plik na swojej metody. Regex nie może i nie powinien być stosowane jako Java jest cross platform i języków, które powodują skutki w różnych systemach

+2

wątpię ważność ostatniego zdania, dlaczego miałoby to być? – n002213f

+2

Regex jest standardem we wszystkich wersjach Java, niezależnie od systemu operacyjnego, nie ma znaczenia, czy go używasz. –

+0

następnie proszę mi powiedzieć, w jaki sposób można rozróżnić pliki i katalogi w systemie UNIX i Windows za pomocą pojedynczego wyrażenia regularnego? Zrozumiałem, że chodziło o "pobranie nazw plików dla plików pasujących do danego wzorca". To przypomina mi pisanie kodu JavaScript, który obsługuje kilka przeglądarek jednocześnie ... –

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

przy użyciu tego kodu możemy filtrować pliki z folderu przy użyciu klas wzorców i matcherów. – hanisa

+0

Myślę, że powinieneś także uciec przed znakiem kropki przed ".zip" do "\\. Zip" – Nap

Powiązane problemy