首页 > 解决方案 > Java 8:如何使用正则表达式列出与模式不匹配的文件

问题描述

出于某种原因,当我希望它只打印出与我的正则表达式模式不匹配的文件时,我的代码将打印所有文件。我需要它来打印出与模式不匹配的文件,因为我不知道那里所有可能的不一致在文件命名中。我在 regex101 上检查了我的正则表达式模式,它是正确的。我不是程序员,但我是一名从事海量数据库工作的心理学学生。

我试过把 Pattern 变成一个列表模式,我试着把 patternList.matcher(file.getName()) 像它自己的 Matcher 变量一样。

    private static void checkFolder(File root, Pattern patternList) {
        for(File file : root.listFiles())

        if(file.isFile()){

            if(patternList.matcher(file.getName()).matches())
                checkFolder(file, patternList);
            else 
                System.out.println(file); //print if it does not match
        }

例如,如果我的代码查看这些文件名:

我的正则表达式是这样的:

    Pattern patternList = Pattern.compile("((\\d{1,3}(F|M)\\.(Front|Profile|Right)"
    +"\\.(Anger|Fear|Frown|Smile)\\.(BW\\.Micro|BW|C\\.Micro|C)))|"
    +"(\\d{1,3}(F|M)\\.(Front|Profile|Right)\\.(Neutral|Smile)\\."
    +"(C\\.Micro|C|BW\\.Micro|BW|HighLight|LowLight|MedLight)\\.(BW\\.Micro|BW|C\\.Micro|C))|"
    +"(\\d{1,3}(F|M)\\.(Selfie1|Selfie2|StudentID)\\.(C\\.Micro|C|BW\\.Micro|BW))")

我的代码应该只打印出 95F Front Anger.BW,因为它有空格而不是点,但我的代码仍然会打印出所有四个文件名。

我也试过这样做:

    private static void checkFolder(File root, Pattern patternList) {
    for(File file : root.listFiles())

        if(file.isFile()){

            if(patternList.matcher(file.getName()).matches()){
                 checkFolder(file, patternList);  //call checkfolder if the filename matches the pattern

            }
            else if(!patternList.matcher(file.getName()).matches())
            {
               System.out.println(file); //print the file that doesnt match the regex
            }

        }       

标签: javaregexloopsiofilenames

解决方案


未经测试,但我猜你想要这样的东西,假设你只是在寻找与模式匹配的文件

private static void checkFolder(File dir, Pattern patternList) {
    for(File file : dir.listFiles()) {
        if (file.isFile()) {
            // only check pattern against files not directories
            if(!patternList.matcher(file.getName()).matches())
                System.out.println(file);
        } else {
            // recurse into any/all sub-directories
            checkFolder(file, patternList);
        }
    }
}

如果你想对结果做一些事情而不是仅仅打印它们,你可以连接成一个列表。

(是的,为了完整,递归不是最好的解决方案,如果您希望遍历深层文件系统路径,这可以更改为使用堆栈循环,但代价是额外的复杂性)


推荐阅读