在java中用量词匹配文件名
我想写一个文件搜索程序,用户可以在其中输入serach模式(任何有效的正则表达式),并返回与之匹配的文件名 e、 g MFile123.tx将找到UMFile123.txt和AIIMFile123.txs 我尝试了以下方法,但无效:在java中用量词匹配文件名,java,regex,Java,Regex,我想写一个文件搜索程序,用户可以在其中输入serach模式(任何有效的正则表达式),并返回与之匹配的文件名 e、 g MFile123.tx将找到UMFile123.txt和AIIMFile123.txs 我尝试了以下方法,但无效: import java.util.regex.*; public class regexTest { public static void main(String... a){ String file="UMFile123.txt";
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!!");
}
}
}
正则表达式应为:
.*MFile123\.tx.*
*
匹配MFile123.tx
您还需要在发送前退出
,因为
引用任何字符
*
指的是该字符前面出现的零个或多个特定字符
因此,
*
意味着匹配0个或更多字符数我将使用正则表达式如下:*MFile123\.tx.
这可以分解为:任何内容的零或多(
*
),然后是MFile123
,然后是literal
(转义),然后是tx
,然后是任何内容的零或多(*
)最简单的解决方案是“引用”或“转义”用户输入文件名/模式,并在其前面添加一个*?
。比如:
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);
我宁愿不去做其他答案中提到的人工逃生的事情。很难找到正确的方法。如果您想要不区分大小写的匹配,只需输入其中一个,您应该会很好。您可以使用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列出给定目录中的图像文件。示例输出如下所示:
我忍不住注意到你在那里复制了我的正则表达式。我想这是一种恭维,~@Billymon嗯……这只是巧合……)谢谢Anirudha!!成功了。但这里的模式是用户输入。As*表示零个或多个字符,并且?表示零或一,那么如果模式用户输入MFile123.tx?UMFile123.txt和AIIMFile123.txs都应该匹配。@user1737079
MFile123.tx?
在这种情况下将匹配MFile123.txx
或MFile123.tx
而不是UMFile123.txt
和AIIMFile123.txs
@billymon如果你不想手动匹配自然正则表达式,我想你应该有两个自己的正则表达式引擎像这里提到的其他答案一样,逃离这些东西不是一个好主意。看看我的回答中使用的quote
方法的用法。谢谢Sanjay!!但问题是一样的。例如,如果filename->UMFile123.txt和pattern->U*.txt,那么匹配就不会发生。SOP是:excapedname:\QU*.txt\E filename->test.txt}{fnamePattern->.\QU*.txt\E.*请帮助。我猜我误解了你的问题。你需要的是“glob”模式匹配,而不是regex匹配。看看哪种方法提供了一个现成的解决方案和替代方案。