4

我想编写一个文件搜索程序,用户可以在其中输入 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!!");
        }
    }
}
4

4 回答 4

2

正则表达式应该是:

.*MFile123\.tx.*

.*匹配前后的任意数字字符MFile123.tx

您还需要转义.之前的 tx,因为

.指任何字符。

*指在它之前出现零次或多次的特定字符

所以,.*意味着匹配 0 个或更多个字符

于 2012-10-11T06:25:56.640 回答
2

我会使用正则表达式如下:.*MFile123\.tx.*

这分解为:零个或多个任何东西(.*),MFile123然后是文字.(转义),tx然后是零个或多个任何东西(.*

于 2012-10-11T06:27:58.387 回答
1

最简单的解决方案是“引用”或“转义”用户输入的文件名/模式并.*?在其前面添加和附加 a。就像是:

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);

我宁愿不进行此处其他答案提到的手动转义业务。很难得到正确的恕我直言。如果您想要不区分大小写的匹配,只需输入一个不区分大小写的正则表达式标志,您应该会很好。

于 2012-10-11T06:31:41.723 回答
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);

    }

}

此代码使用正则表达式列出给定目录中的图像文件。示例输出如下所示:

输出

于 2012-10-11T09:13:13.000 回答