我想编写一个文件搜索程序,用户可以在其中输入serach模式(任何有效的正则表达式),并返回与之匹配的文件名。
例如 MFile123.tx 将找到UMFile123.txt和AIIMFile123.txs
我尝试了以下操作,但它不起作用:
import java.util.regex.*;
public class regexTest {
public static void main(String... a){
String file="UMFile123.txt";
//String pattern="*MFile*.tx?"; TRIED with \*MFile*.tx , but no use
String pattern="UMFile*.tx?";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(file);
if(m.matches()){
System.out.println("Hi!it matches!!");
}
}
}
答案 0 :(得分:1)
正则表达式应为:
.*MFile123\.tx.*
.*
匹配MFile123.tx
你还需要在tx之前转义.
,因为
.
指的是任何角色。
*
指的是在其之前出现零个或多个特定字符
因此,.*
表示匹配0个或更多个字符
答案 1 :(得分:1)
我会使用正则表达式,如下所示:.*MFile123\.tx.*
这会分解为:零或更多的任何内容(.*
)后跟MFile123
,后跟文字.
(转义),然后是tx
,后跟零或更多任何事情(.*
)
答案 2 :(得分:1)
最简单的解决方案是“引用”或“转义”用户输入的文件名/模式和前置&附加一个.*?
。类似的东西:
final String userFname = "MFile123.tx";
final String escapedName = Pattern.quote(userFname);
final String fnamePattern = ".*?" + escapedName + ".*";
final Pattern pat = Pattern.compile(fnamePattern);
final Matcher m = pat.matcher(file);
我宁愿不去处理其他答案中提到的手动转义业务。狡猾得到正确的恕我直言。如果你想要不区分大小写的匹配,只需要输入insensitive regex flags中的一个就可以了。你应该很好。
答案 3 :(得分:0)
您可以使用File.listFiles(FileFilter)。请查看以下示例以便更好地理解:
package com.stackoverflow.works;
import java.io.File;
import java.io.FileFilter;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;
/*
* @Author: sarath_sivan
*/
public class FileSearchService {
/*
* @Description: Method used to List the files
* @param: directory File, regex String
* @return: fileList File[]
*/
public static File[] search(File directory, String regex) {
if(!directory.isDirectory()) {
throw new IllegalArgumentException(directory+" is no directory.");
}
final Pattern pattern = Pattern.compile(regex); // Caution: could also throw an exception!
return directory.listFiles(new FileFilter(){
@Override
public boolean accept(File file) {
return pattern.matcher(file.getName()).matches();
}
});
}
/*
* @Description: Method used to print the File List
* @param: fileList File[]
* @return: void
*/
public static void printFileList(File[] fileList) {
for (File file : fileList) {
System.out.println("File Name: " + file.getName());
System.out.println("Absolute Path: " + file.getAbsolutePath());
System.out.println("Last Modified: " + getLastModifiedTimestamp(file));
System.out.println();
}
}
/*
* @Description: Method used to get the Last Modified Timestamp
* @param: file File
* @return: void
*/
public static String getLastModifiedTimestamp(File file) {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
return sdf.format(file.lastModified());
}
/*
* @Description: Main method used to test the Regex File listing logic
* @param: fileList File[]
* @return: void
*/
public static void main(String[] args) {
String directoryPath = "C:/Users/sarath_sivan/Desktop";
File directory = new File(directoryPath);
String regex = "([^\\s]+(\\.(?i)(jpg|png|gif|bmp))$)"; //Regular Expression pattern for image file extension
File[] fileList = search(directory, regex);
printFileList(fileList);
}
}
此代码使用regex列出给定目录中的图像文件。示例输出如下所示: