2010-05-28 4 views
7

Можно ли использовать регулярное выражение для получения имен файлов для файлов, соответствующих данному шаблону в каталоге, без необходимости вручную прокручивать все файлы.Regex для файлов в каталоге

ответ

25

Вы можете использовать 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

Таким образом, чтобы соответствовать файлы, которые выглядят как: TXT-20100505-XXXX.trx где XXXX могут быть любые четыре последовательные цифры, сделать что-то вроде этого:

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

У меня есть файлы в формате TXT-20100505-0000.trx, где * 0000 * меняют номера. TXT-20100525 - * \. Trx не оценивает. как я могу получить такие файлы? – n002213f

+0

Вы ошибочно вводили 'TXT-201005525 -. * \. Trx'? Образец, который вы написали, будет соответствовать нулю или больше '-', за которым следует' .trx'. – msw

+0

спасибо msw, я не ошибся, мое понимание получило все файлы с префиксом 'TXT-20100525', за которым следуют любые символы, а затем' .trx'. Какая значимость или причина наличия дополнительных '.' перед' * \\ ' – n002213f

1

реализовать FileFilter (только требует, чтобы переопределить метод

public boolean accept(File f) 

тогда, каждый раз, когда вы будете запрашивать список файлов, будет сравнивать JVM каждый файл с вашего метода. Regex не могут и не должны можно использовать в качестве Java является кросс язык платформы и что может вызвать последствия на различных системах

+2

я сомневаюсь в справедливости последнего предложения, зачем это было? – n002213f

+2

Regex является стандартным для всех версий Java, независимо от операционной системы, не имеет значения, используете ли вы его. –

+0

, то, пожалуйста, скажите, как бы вы различали файлы и каталоги в unix и windows с одним регулярным выражением? Я понял, что вопрос заключается в том, чтобы «получить имена файлов для файлов, соответствующих заданному шаблону». Это напоминает мне о написании Javascript, который поддерживает сразу несколько браузеров ... –

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

, используя этот код, мы можем фильтровать файлы из папки с использованием классов шаблонов и классов. – hanisa

+0

Я думаю, вам также следует избегать символа точки до «.zip» до «\\. Zip», – Nap

Смежные вопросы