基于正则表达式的分裂模式

时间:2012-07-26 13:20:16

标签: java regex garbage-collection matcher

我正在尝试编写一个解析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()); 
    }
  }
}

1 个答案:

答案 0 :(得分: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起,按其开头的(顺序排列。