2014-06-17 70 views
1

我试图用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 
+0

什么是预期输出? –

+0

找到的值:1 \ n 找到的值:XmlAggregator \ n 找到的值:268803451 \ n 找到的值:3 \ n – Arun

+0

请编辑您的问题并添加它。 –

回答

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)); 
    } 
} 
+0

有没有办法找到所有的比赛? – Arun

4

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

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

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