我正在尝试使用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 :(得分: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));
}
}