java - 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
}
例如,如果我的代码查看这些文件名:
- 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);
}
}
}
如果你想对结果做一些事情而不是仅仅打印它们,你可以连接成一个列表。
(是的,为了完整,递归不是最好的解决方案,如果您希望遍历深层文件系统路径,这可以更改为使用堆栈循环,但代价是额外的复杂性)
推荐阅读
- c++ - 我无法通过 vcpkg 导入 range-v3 库
- python - PYTHON - 合并日期索引上的两个数据框
- python - 如何每次运行脚本,同时访问 Flask 页面
- ios - 应用程序获得批准并准备销售后,iOS 应用程序内购买无法正常工作
- flutter - 如何使用颤振以编程方式发送推送通知?
- xamarin - UWP 上的 Xamarin.Auth 失败
- laravel - 如何在 laravel 中的数据表搜索框类型上调用 ajax
- c# - 为什么可选加载项未在功能区上显示为单独的选项卡?
- excel - 从条形图中删除#NV 标签
- java - EntityManager 在 Junit 测试中给出 NullPointerException