2016-10-29 48 views
1

正如標題所說,我寫了一個java代碼來使用正則表達式來計算給定文件中的所有匹配項,當我運行代碼時,out與文件中的匹配。如果我將每個字符串分隔成一個新行,它會很好地工作。這裏是我的代碼:Java正則表達式不計算給定文件中的所有匹配

這是應該算方法:

private static int countOccurrences(String path, String regex) { 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher; 
    int count = 0; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(path)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      matcher = pattern.matcher(line); 
      if (matcher.find()) 
       count++; 
     } 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return count; 
} 

下面是一個使用該方法的代碼:

String regex = "(00966|\\+966)\\d{9}"; 
int countNumbers = countOccurrences(fileContainsNumbers, regex); 

這是我從讀文件:

Lorem Ipsum簡直就是假人+966111111111文字的印刷和 排版行業。+ 966222222222 Lorem Ipsum has一直是業界的 標準虛擬文本有史以來+966333333333自1500年以來,當一個 未知的打印機採取類型的廚房和加擾+966444444444 +96645789541063它製作一個類型樣本書。 +966569874514它不僅存活了五個世紀,而且還跳入電子排版 排版,其餘+966569874514基本不變。它是 推廣+966569874514在20世紀60年代隨着發佈Letraset 表包含Lorem Ipsum段落,最近與桌面 發佈軟件如Aldus PageMaker +966555555555包括 版本的Lorem Ipsum。

回答

1

您正在以錯誤的方式使用find()方法。取而代之的

if (matcher.find()) 
    count++; 

你應該做的

while (matcher.find()) 
    count++; 

你看,你可以有多個每行匹配。因此,該方法可以針對包含這些多個匹配項的任何行返回true幾次。但是你在第一次真實之後就不再計算了!

換句話說:如果你想統計每一行的所有匹配,那麼不要在第一次匹配後停止計數!

+0

哦,我明白了,這就是爲什麼它在每行的第一場比賽中停止計數。但是這段代碼是否會遍歷整個文件?或者我必須在文件循環中使用另一個循環? – Chance

+1

你爲什麼不試試呢?我認爲它應該工作。你看 - 你已經在循環該文件中的所有行。然後,您應該循環匹配器以計算PER線的匹配數。按照建議已經用WHILE替換IF添加你需要的內循環! – GhostCat

+0

它工作完美,非常感謝你。我會盡量找到一個更好的方法來使用「一個循環」,而不是「嵌套循環」,如果可能的話。 標記爲答案;) – Chance