2012-07-26 53 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