2012-07-26 51 views
0

我想編寫一個程序來解析Java垃圾收集日誌。我剛剛創建了一個與小集合相匹配的語法。一旦我確定了一種模式,我想將它解析爲單個的令牌。我的問題是,有沒有用我以前定義的語法來做這件事的優雅方法?基於正則表達式的拆分模式

public class RegexTestHarness { 
    private final static String REGEX_SMALL_COLLECTION = "\\d+\\.\\d+: \\[GC \\d+.\\d+: \\[ParNew: \\d+K\\-\\>0K\\(\\d+K\\), \\d+.\\d+ secs\\] \\d+K\\-\\>\\d+K\\(\\d+K\\), \\d+.\\d+ secs\\]"; 

    public static void main(String[] args){ 
    Pattern pattern = Pattern.compile(REGEX_SMALL_COLLECTION);   
    Matcher matcher = pattern.matcher("54.770: [GC 54.770: [ParNew: 5232768K->0K(5237824K), 1.1304192 secs] 5238622K->380448K(10480704K), 1.1306410 secs]"); 
    while (matcher.find()) {    
     System.out.println(matcher.group(0)); 
     System.out.println(matcher.start()); 
     System.out.println(matcher.end()); 
    } 
    } 
} 
+2

有什麼問題嗎?你看起來像是一個很好的開始,儘管我會寫一個單元測試,每個測試都有一個GC日誌中的一行 – hvgotcodes 2012-07-26 13:22:37

+0

我傳遞給pattern.matcher的字符串被正確解析,這意味着它匹配模式,但是我的下一步是I想將字符串拆分爲令牌。對於上面的示例:54.770,54.770,5232768,5237824,1.1304192 ...等等。我覺得根據我提供的模式,必須有一種我可以調用的方法來分割我的模式。 – ddd 2012-07-26 13:31:33

+0

啊我現在明白了。添加了一個答案... – hvgotcodes 2012-07-26 13:35:21

回答

1

你需要添加組到你的正則表達式。

private final static String REGEX_SMALL_COLLECTION = "(\\d+\\.\\d+): \\[GC (\\d+.\\d+): \\[ParNew: \\d+K\\-\\>0K\\(\\d+K\\), \\d+.\\d+ secs\\] \\d+K\\-\\>\\d+K\\(\\d+K\\), \\d+.\\d+ secs\\]";

,然後訪問組的值。在上面的例子中,我在你想要的前兩項中添加了括號 - 這會告訴正則表達式引擎捕獲匹配的子字符串。您將需要添加更多。正如您目前所做的那樣,您使用Matcher.group()來獲取每個組。請注意,組0始終是整個匹配項。其餘的編號從1起,依次是他們的開頭零星(

+0

真棒!這正是我期待的,謝謝。 – ddd 2012-07-26 13:42:44