2014-01-08 3 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이 '답변에 가까운'것입니다. – PopoFibo

+1

@PopoFibo 다음 페어 플레이 주셔서 감사합니다 :) – Mena

+0

+1 너무 빠르다. – gowtham

관련 문제