2011-04-13 100 views
1

我有一個巨大的日誌文件,包含不同類型的字符串行,我需要從這些「智能」方式提取數據。匹配算法或正則表達式?

示例代碼段:

2011-03-05 node32_three INFO stack trace, at empty string asfa 11120023 
--- - MON 23 02 2011 ERROR stack trace NONE       

例如,什麼是提取每行日期的最好方式,獨立日期格式的?

+0

你的意思是'提取日期'?因爲你的例子有兩個日期。 – pavium 2011-04-13 12:52:51

+0

我是否正確理解您的巨大日誌文件包含不同類型的行,其中日期可能以不同的格式顯示?如果是這種情況,那麼正則表達式可能不是一個好的解決方案。 – MarcoS 2011-04-13 12:55:37

+1

@heykalrm:我編輯了你的問題,在你的例子中顯示了單行,但我不確定我是否正確。請檢查它並確認線路拆分是否在正確的位置。 – 2011-04-13 12:58:56

回答

3

你可以爲不同格式的正則表達式,像這樣:

(fmt1)|(fmt2)|.... 

FMT1FMT2等都是個別的正則表達式,用於侑例如

(20\d\d-[01]\d-[0123]\d)|((?MON|TUE|WED|THU|FRI|SAT|SUN) [0123]\d [01]\d 20\d\d) 

請注意,以防止匹配任意數字的機會我相應地限制了年,月和日的數字。例如,天數不能與4開始,也不能一個月數開始2.

這給出了下面的僞代碼:

// remember that you need to double each backslash when writing the 
// pattern in string form 
Pattern p = Pattern.compile("..."); // compile once and for all 
String s; 
for each line 
    s = current input line; 
    Matcher m = p.matcher(s); 
    if (m.find()) { 
     String d = m.group(); // d is the string that matched 
     .... 
    } 

每個單獨的日期模式被寫在()以使其可以找出我們有什麼樣的格式,像這樣:(?正則表達式)

 int fmt = 0; 
     // each (fmt) is a group, numbered starting with 1 from left to right 
     for (int i = 1; fmt == 0 && i <= total number of different formats; i++) 
      if (m.group(i) != null) fmt = i; 

對於這項工作,內部(正則表達式)組必須這麼寫,他們不爲捕獲組數,看看更新例。

+0

太棒了!上面的正則表達式是否可能有一些Java實現示例? – carloscloud 2011-04-14 08:08:59

+1

@heykarlm - 增加了一些幾乎Java的僞代碼。 – Ingo 2011-04-14 08:42:33

1

如果您使用Java,您可能需要查看Joda time。另請閱讀question and related answers。我認爲Joda DateTimeFormat應該爲您提供解析日誌文件的各種日期/時間格式所需的所有靈活性。

一個簡單的例子:

String dateString = "2011-04-18 10:41:33"; 
DateTimeFormatter formatter = 
    DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); 
DateTime dateTime = formatter.parseDateTime(dateString); 

只要定義爲您的格式,日期/時間String[],每個元素傳遞給DateTimeFormat得到相應的DateTimeFormatter。您可以使用正則表達式只是從日誌行中的其他內容中分離日期字符串,然後您可以使用各種DateTimeFormatter來嘗試解析它們。