匹配文件名与java中的量词

时间:2012-10-11 06:24:28

标签: java regex

我想编写一个文件搜索程序,用户可以在其中输入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 个答案:

答案 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列出给定目录中的图像文件。示例输出如下所示:

output