问题
I need to implement
File[] files = getFiles( String folderName, String ptrn );
Where ptrn is a command prompt style pattern like "*2010*.txt"
I'm familar with FilenameFilter class, but can't implement
public boolean accept(File dir, String filename)
because String.matches() doesn't accept such patterns.
Thanks!
回答1:
The String#matches() accepts regular expression patterns.
The regex variant of the "layman's" variant *2010*.txt
would be .*2010.*\.txt
.
So the following should work:
public boolean accept(File dir, String name) {
return name.matches(".*2010.*\\.txt");
}
The double backslash is just there to represent an actual backslash because the backslash itself is an escape character in Java's String
.
Alternatively, you can also do it without regex using the other String
methods:
public boolean accept(File dir, String name) {
return name.contains("2010") && name.endsWith(".txt");
}
Your best bet is likely to let ptrn
represent a real regex pattern or to string-replace every .
with \.
and *
with .*
so that it becomes a valid regex pattern.
public boolean accept(File dir, String name) {
return name.matches(ptrn.replace(".", "\\.").replace("*", ".*"));
}
回答2:
You may need to scape your specific wild cards for those used in Java regex.
For instance to replace "*" you could use something like:
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
来源:https://stackoverflow.com/questions/3057621/java-filenames-filter-pattern