获取正则表达式数据

时间:2014-06-17 20:51:59

标签: java regex

我正在尝试使用java正则表达式来提取数据。它匹配我的数据,但我无法获取组数据。我正在尝试获取数据1,xmlAggregator,268803451,3。看看文档,我假设如果我把()放在\ d +和\ w +附近,我会得到组内的数字和字符串。有关如何更改正则表达式的任何建议吗?

字符串:

Span(trace_id:1, name:XmlAggregator, id:268803451, parent_id:3)

Java代码:

      String pattern="Span\\(trace_id:(\\d+), name:(\\w+), id:(\\d+), parent_id:(\\d+), (duration:(\\d+))*";
      Pattern r = Pattern.compile(pattern);
      Matcher m = r.matcher(line);

      int count = 0;

      while(m.find()) {
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
         System.out.println("Found value: " + m.group(count) );
         count++;
      }

输出:

Match number 0
start(): 0
end(): 64
Found value: Span(trace_id:1, name:XmlAggregator, id:268803451, parent_id:3, 

希望得到:

   
Found value: 1 
Found value: XmlAggregator 
Found value: 268803451 
Found value: 3 

2 个答案:

答案 0 :(得分:4)

您可以使用匹配结果上的group方法访问捕获组(未转义的括号内的匹配部分):

System.out.println("Trace ID = " + m.group(1));
System.out.println("Name = " + m.group(2));
// etc...

请注意,您开始从1开始计算捕获组,而不是0.这是因为组0对应于整个匹配的字符串。

答案 1 :(得分:2)

每个值都在一个组内。因此,您可以循环匹配的组数,并为每个组打印组号,值,起始索引等:

if(m.find()) {
    for(int count = 1; count <= m.groupCount(); count++) {
        System.out.println("Match number " + count);
        System.out.println("start(): " + m.start(count));
        System.out.println("end(): " + m.end(count));
        System.out.println("Found value: " + m.group(count));
    }
}