шаблон фильтра имен файлов java [дубликат]
этот вопрос уже есть ответ здесь:
мне нужно реализовать
File[] files = getFiles( String folderName, String ptrn );
где ptrn-шаблон стиля командной строки, например " * 2010*.txt"
Я знаком с классом FilenameFilter, но не могу реализовать
public boolean accept(File dir, String filename)
потому что стринг.matches () не принимает такие шаблоны.
спасибо!
2 ответов
на String#matches()
принимает регулярные выражения шаблоны.
вариант regex варианта "непрофессионала"*2010*.txt
будет .*2010.*\.txt
.
поэтому должно работать следующее:
public boolean accept(File dir, String name) {
return name.matches(".*2010.*\.txt");
}
двойная обратная косая черта просто существует, чтобы представить фактическую обратную косую черту, потому что сама обратная косая черта является escape-символом в Java String
.
альтернативно, вы также можете сделать это без использования regex другой String
методы:
public boolean accept(File dir, String name) {
return name.contains("2010") && name.endsWith(".txt");
}
ваш лучший выбор, вероятно, чтобы ptrn
представляют собой настоящее шаблон regex или строка-заменить каждый .
С \.
и *
С .*
чтобы он стал допустимым шаблоном регулярных выражений.
public boolean accept(File dir, String name) {
return name.matches(ptrn.replace(".", "\.").replace("*", ".*"));
}
вам, возможно, потребуется просмотреть Ваши конкретные wild-карты для тех, которые используются в Java regex.
например, для замены " * " вы можете использовать что-то вроде:
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