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



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

您需要将组添加到正则表达式中。

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\]";

然后访问这些值的组。在上面的例子中,我在您想要的前两个项目周围添加了括号——这告诉regex引擎捕获匹配的子字符串。您需要添加更多。正如您目前所做的,您使用Matcher.group()来获取每个组。请注意,组0始终是完全匹配的。其余部分按其开头括号(的顺序从1开始编号。

最新更新