java文件名过滤模式

时间:2010-06-16 22:27:39

标签: java regex filter filenames

我需要实施

File[] files = getFiles( String folderName, String ptrn );

其中ptrn是一个命令提示符样式模式,如“* 2010 * .txt”

我熟悉FilenameFilter类,但无法实现 public boolean accept(File dir, String filename) 因为String.matches()不接受这样的模式。

谢谢!

2 个答案:

答案 0 :(得分:17)

String#matches()接受regular expression patterns

“外行”变体*2010*.txt的正则表达式变体为.*2010.*\.txt

所以以下内容应该有效:

public boolean accept(File dir, String name) {
    return name.matches(".*2010.*\\.txt");
}

双反斜杠就是代表一个实际的反斜杠,因为反斜杠本身是Java String中的转义字符。

或者,您也可以使用其他String方法在没有正则表达式的情况下执行此操作:

public boolean accept(File dir, String name) {
    return name.contains("2010") && name.endsWith(".txt");
}

您最好的选择可能是让ptrn代表真正的正则表达式模式,或者将每个.字符串替换为\.*使用.*使其成为有效的正则表达式模式。

public boolean accept(File dir, String name) {
    return name.matches(ptrn.replace(".", "\\.").replace("*", ".*"));
}

答案 1 :(得分:2)

您可能需要使用Java正则表达式中使用的特定通配符。

例如,要替换“*”,您可以使用以下内容:

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