шаблон фильтра имен файлов 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