2014-06-17 69 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對應於整個匹配的字符串。