The String#matches()
accepts regular expression patterns.
Regex-вариант "мирского" варианта *2010*.txt
будет .*2010.*\.txt
.
Таким образом, должно получиться следующее:
public boolean accept(File dir, String name) {
return name.matches(".*2010.*\\.txt");
}
Двойная обратная косая черта используется только для представления действительной обратной косой черты, потому что сама обратная косая черта является управляющим символом в String
Java.
В качестве альтернативы, вы можете сделать это и без 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("*", ".*"));
}
Вам может потребоваться очистить определенные подстановочные знаки для тех, которые используются в регулярном выражении 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