由于某种原因,当我只希望打印出与正则表达式模式不匹配的文件时,我的代码将打印所有文件。我需要它来打印与模式不匹配的文件,因为我不知道所有文件命名中可能存在不一致的地方。我在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
}
例如,如果我的代码查看以下文件名:
我的正则表达式是这样:
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
}
}
答案 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));
}
}
jex.im可视化正则表达式:
该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果你喜欢。
此外,也许我们可以以此方式设计表达式,
^(\d{1,3})\s*([FM])\s*\.?(\w+)\s*\.?(\w+)\s*\.?(\w+\.\w+|\w+)\s*$
那也可以,虽然不确定。
要否定模式,我们可以尝试:
^(?!(?:((\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)))).*$
或者,如果可以的话,可以简化一点: