2014-01-08 127 views
0

我有一個文本文件。該特定文本文件的示例內容就像正則表達式提取鍵值對

root(ROOT-0, good-4)nn(management-2, company-1)nsubj(good-4, management-2) 

現在我需要將它分開並將其存儲在ArrayList中。爲此我寫下面的代碼

public class subject { 
public void getsub(String f){ 
    ArrayList <String>ar=new ArrayList<String>(); 
    String a="[a-z]([a-z]-[0-9],[a-z]-[0-9])"; 
    Pattern pattern=Pattern.compile(a); 
    Matcher matcher=pattern.matcher(f); 
    while(matcher.find()){ 
     if(matcher.find()){ 
      ar.add(matcher.group(0)); 
     } 
    } 
    System.out.println(ar.size()); 
    for(int i=0;i<ar.size();i++){ 
     System.out.println(ar.get(i)); 
    } 



} 

} 

但arraylist沒有得到填充。這是爲什麼

回答

3

您在您的Pattern中使用不加引號的括號。

未加引號的括號意味着您的Pattern中的一個組的定義,用於以後的引用。

但是,在這裏您試圖匹配實際的括號,因此它們需要像這樣轉義:\\(\\)

對於一個粗略的解決方案,試試這個:

String text = "root(ROOT-0, good-4)nn(management-2, company-1)nsubj(good-4, management-2)"; 
List<String> myPairs = new ArrayList<String>(); 
Pattern p = Pattern.compile(".+?\\(.+?,.+?\\)"); 
Matcher m = p.matcher(text); 
while (m.find()) { 
    myPairs.add(m.group()); 
} 
System.out.println(myPairs); 

輸出:

[root(ROOT-0, good-4), nn(management-2, company-1), nsubj(good-4, management-2)] 

最後一點:一種改進的解決方案,我會嘗試和使用羣體的第一部分區分你Pattern和括號中的實際對,所以在這種情況下建立一個Map<String, ArrayList<String>>作爲數據對象 - 但這不在這個答案的範圍內。

+0

+1是'this'與答案接近! – PopoFibo

+1

@PopoFibo然後感謝公平競爭:) – Mena

+0

+1太快.. – gowtham