[英]Java 8: How to list files that don't match pattern using regex
由於某種原因,當我只希望打印出不匹配我的正則表達式模式的文件時,我的代碼將打印所有文件。我需要它打印不匹配該模式的文件,因為我不知道那里所有可能的不一致之處在文件命名中。 我在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
}
}
未經測試,但是我猜您想要這樣的東西,假設您只是在尋找與模式匹配的文件 :
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);
}
}
}
如果除了打印結果以外,還想對結果做一些事情,可以將其串聯成一個列表。
(是的,要進行完整的研究,如果您希望遍歷深層的文件系統路徑,則遞歸並不是最好的解決方案,可以將其更改為使用堆棧循環,這會增加額外的復雜性)
您的表達式工作正常,您可能只想替換\\.
與類似:
(?:\.|\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的右上角對表達式進行了說明,如果您希望對其進行探索/簡化/修改,並且在此鏈接中 ,您可以根據需要觀看它與某些示例輸入的匹配方式。
另外,也許如果我們以這種方式設計表達式,
^(\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)))).*$
或者可以簡化一點,如果可以的話:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.