Java 8:如何使用正则表达式列出与模式不匹配的文件

时间:2019-07-29 19:38:37

标签: java regex loops io filenames

由于某种原因,当我只希望打印出与正则表达式模式不匹配的文件时,我的代码将打印所有文件。我需要它来打印与模式不匹配的文件,因为我不知道所有文件命名中可能存在不一致的地方。我在regex101上检查了我的regex模式,这是正确的。我不是编码员,但是我是心理学学生,正在研究海量数据库。

我试图将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
        }

例如,如果我的代码查看以下文件名:

  • 95F Front Anger.BW
  • 95F.Front.Anger.C.Micro
  • 95F.Front.Fear.C.Micro
  • 95F.Front.Frown.BW

我的正则表达式是这样:

    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
            }

        }       

2 个答案:

答案 0 :(得分:0)

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

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

如果除了打印结果以外,还想对结果做些什么,可以将其连接到列表中。

(是的,要进行完整的研究,如果您希望遍历较深的文件系统路径,则递归并不是最好的解决方案,可以将其更改为使用堆栈循环,这会增加额外的复杂性)

答案 1 :(得分:0)

您的表达式效果很好,您可能只想将\.替换为:

(?:\.|\s+)

\s*\.?

[.\s]

[. ]

在必要时,它可能会正常工作。

((\d{1,3}([FM])(?:\.|\s+)(Front|Profile|Right)(?:\.|\s+)(Anger|Fear|Frown|Smile)(?:\.|\s+)(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))

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "((\\d{1,3}([FM])(?:\\.|\\s*)(Front|Profile|Right)(?:\\.|\\s*)(Anger|Fear|Frown|Smile)(?:\\.|\\s*)(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))";
final String string = "95F    Front   Anger   BW\n"
     + "95F Front Anger BW\n"
     + "95F Front Anger.BW\n"
     + "95F.Front.Anger.C.Micro\n"
     + "95F.Front.Fear.C.Micro\n"
     + "95F.Front.Frown.BW";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

RegEx电路

jex.im可视化正则表达式:

enter image description here

该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果你喜欢。


此外,也许我们可以以此方式设计表达式,

^(\d{1,3})\s*([FM])\s*\.?(\w+)\s*\.?(\w+)\s*\.?(\w+\.\w+|\w+)\s*$ 

那也可以,虽然不确定。

DEMO 2


要否定模式,我们可以尝试:

^(?!(?:((\d{1,3}([FM])\.(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)))).*$

DEMO 3


或者,如果可以的话,可以简化一点:

DEMO 4