2014-10-16 110 views
1

我正在比較大量的字符串(日誌條目)來驗證某些系統結果沒有改變。我的第一次嘗試足夠直接,只是使用.equals()比較。如果.equals()失敗。與正則表達式差異的Java字符串比較?

只有當我的系統結果記錄在同一天時,這才起作用。部分數據包括訪問時間戳。我不介意訪問日期是否不同,這是我擔心的其餘有效負載。

由於從琴絃,我比較的一小部分例子:

...3X68 : accessed 14 Oct 2014 : from quo... 
...3X68 : accessed 16 Oct 2014 : from quo... 

的字符串有我想忽略「訪問的DD MMM YYYY」標籤的多種情況,一般在5- 10,但在某些情況下,數據可能是數百千字節,數百個數據塊,每個數據塊都有一個訪問郵票的副本。 (是的,刪除冗餘是名單上。)

我已經嘗試了幾次與正則表達式「accessible \ d \ d ... \ d \ d \ d \ d \ d」不匹配的嘗試,但由於子字符串可能會出現多次,我最終用幾個這樣的搜索來編寫正則表達式測試,但由於它可能會出現一百次或更多次,這很快就不切實際了。

有什麼更好的方法來運行這種類型的字符串比較異常?直接或通過利用圖書館?

回答

2

確實有很多方法可以解決這個問題。考慮到String.equals()比較除了時間戳問題之外還有其他目的,比較直接的方法是從輸入數據和比較數據中去除時間戳,並使用String.equals()來比較您關心的部分(即剩下的部分)。您可以使用正則表達式做剝離:

Pattern tsPattern = Pattern.compile("accessed \d\d ... \d\d\d\d"); 
Matcher m = tsPattern.matcher(input); 
String stripped = m.replaceAll(""); 

你也可以做到這一點與String.replaceAll(),但如果你做了很多的替代物,然後用Matcher去是便宜,因爲你可以做

m.reset(nextInput); 

避免重新編譯每個字符串的正則表達式。

+0

欣賞它。這種方法奏效了。此外,很高興知道進行替換的匹配器,但我擔心可能會拆分一串子串段的內存要求。在某些情況下,有幾百兆字節的日誌,我擔心Java的字符串內存問題。迄今爲止內存並沒有爆炸得太厲害。 – Bryan 2014-10-17 15:52:00