出于某种原因,当我希望它只打印出与我的正则表达式模式不匹配的文件时,我的代码将打印所有文件。我需要它打印出与模式不匹配的文件,因为我不知道文件命名中可能存在的所有不一致之处。我在 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
}
例如,如果我的代码查看这些文件名:
- 95F前愤怒.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
}
}
未经测试,但我猜你想要这样的东西,假设你只寻找与模式匹配的文件:
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);
}
}
}
如果您想对结果执行某些操作而不仅仅是打印结果,则可以连接到一个列表中。
(是的,为了迂腐地完成,如果您希望遍历深层文件系统路径,则递归不是最好的解决方案,这可以更改为使用堆栈进行循环,但代价是额外的复杂性)
我是一名优秀的程序员,十分优秀!