簡體   English   中英

Java 8:如何使用正則表達式列出與模式不匹配的文件

[英]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
        }

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

  • 95F前憤怒
  • 95F.Front.Anger.C.Micro
  • 95F正面恐懼微縮模型
  • 95F前皺眉

我的正則表達式是這樣的:

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

RegEx電路

jex.im可視化正則表達式:

在此處輸入圖片說明

regex101.com的右上角對表達式進行了說明,如果您希望對其進行探索/簡化/修改,並且在此鏈接中 ,您可以根據需要觀看它與某些示例輸入的匹配方式。


另外,也許如果我們以這種方式設計表達式,

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

那也許也可以,雖然不確定。

演示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)))).*$

演示3


或者可以簡化一點,如果可以的話:

演示4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM