我写了这段代码来搜索文件:
package filesearch;
import java.io.File;
public class FileSearch {
public void walk(String path, String partOfFile) {
File root = new File(path);
File[] list = root.listFiles();
if (list == null)
return;
for (File f : list) {
if (f.isDirectory()) {
walk(f.getAbsolutePath(), partOfFile);
} else {
if (f.getAbsolutePath().contains(partOfFile)) {
System.out.println("File:" + f.getAbsoluteFile());
}
}
}
}
public static void main(String[] args) {
FileSearch fw = new FileSearch();
fw.walk("g:\\", "abs");
}
}
我想使用通配符(*)。如果(*)是模式的第一个或最后一个字符,我可以通过添加以下代码来实现它:
if(f.getAbsolutePath().startsWith(partOfFile)){
System.out.println( "File:" + f.getAbsoluteFile() );
}
if(f.getAbsolutePath().endWith(partOfFile)){
System.out.println( "File:" + f.getAbsoluteFile() );
}
当我有多个通配符(*)并且模式中间有通配符(*)时,我该如何处理?
发布于 2013-11-29 17:38:20
试试这个程序。
import java.io.File;
public class FileSearch
{
public void walk( String path, String partOfFile )
{
File root = new File( path );
File[] list = root.listFiles();
if ( list == null )
return;
for ( File f : list )
{
if ( f.isDirectory() )
{
walk( f.getAbsolutePath(), partOfFile );
}
else
{
boolean isFileMatched = isFileMatched( f, partOfFile);
if ( isFileMatched )
System.out.println( "File:" + f.getAbsoluteFile() );
}
}
}
private boolean isFileMatched( File file, String partOfFile )
{
boolean isMatched = true;
if ( file == null || partOfFile == null )
return false;
String fileName = file.getName();
//to ignore extension
if ( fileName.contains( "." ) )
fileName = fileName.substring( 0, fileName.lastIndexOf( "." ) );
String[] tokens = null;
if ( partOfFile.contains( "*" ) )
{
if ( partOfFile.startsWith( "*" ) && partOfFile.endsWith( "*" ) )
{
tokens = partOfFile.split( "\\*" );
isMatched = isTokenMatched( isMatched, fileName, tokens );
}
else if ( partOfFile.startsWith( "*" ) )
{
String suffix = partOfFile.substring( partOfFile.lastIndexOf( "*" ) + 1 );
if ( fileName.endsWith( suffix ) )
{
tokens = partOfFile.split( "\\*" );
isMatched = isTokenMatched( isMatched, fileName, tokens );
}
else
isMatched = false;
}
else if ( partOfFile.endsWith( "*" ) )
{
String prefix = partOfFile.substring( 0, partOfFile.indexOf( "*" ) );
if ( fileName.startsWith( prefix ) )
{
tokens = partOfFile.split( "\\*" );
isMatched = isTokenMatched( isMatched, fileName, tokens );
}
else
isMatched = false;
}
else
{
if ( !fileName.equals( partOfFile ) )
isMatched = false;
}
}
return isMatched;
}
private boolean isTokenMatched( boolean isMatched, String fileName, String[] tokens )
{
if ( tokens != null )
{
for ( String token : tokens )
{
if ( !fileName.contains( token ) )
{
isMatched = false;
break;
}
}
}
return isMatched;
}
public static void main( String[] args )
{
FileSearch fw = new FileSearch();
fw.walk("g:\\" , "abs");
}
}
发布于 2013-11-29 18:02:34
有很多其他的方法可以得到你想要的东西,但是从编码和匹配的角度来说,将带有通配符的模式转换为正则表达式是最有效的,就像你使用startsWith和endWith的方式一样,你可以使用readability.Just函数和一个正则表达式来快速验证你想要的东西。
您所要做的就是用.*?
替换模式中的*
。这样,带通配符的模式将被转换为非贪婪正则表达式。然后,只需使用一个函数来验证字符串中是否存在该模式。下面的示例验证中间是否有*。此方法适用于任意数量的通配符。
partOfFile = ".*?"+partOfFile.replace("*",".*?")+".*?"; // fi*e.log becomes .*?fi.*e.log.*?
if(f.getAbsolutePath().matches(partOfFile))
{
System.out.println( "File:" + f.getAbsoluteFile() );
}
matches函数将接受正则表达式作为输入。我们要放置一个.*?在模式的前后,确保我们可以在模式的前后有一些字符。
发布于 2013-11-29 13:54:01
使用regular expressions过滤文件名。
https://stackoverflow.com/questions/20287274
复制