2016-10-17 2 views
1

정규식을 사용하여 태그 안에 XML 태그와 텍스트를 모두 추출하려고합니다. 나는 정규식을 사용하는 것이 최선의 선택이 아니라는 것을 알고있다. 필자는 인라인 텍스트 파일에 태그가 거의 없으므로 XML 파서를 선택하지 않았습니다.정규식을 사용하여 태그 사이의 텍스트 및 태그 추출

String txt="American Airlines made <TRIPS> 100 </TRIPS> flights in <DATE> December </DATE> over <ROUTE> Altantic </ROUTE> "; 

String re1="<([^>]+)>"; // Tag 1 
String re2="([^<]*)"; // Variable Name 1 
String re3="</([^>]+)>"; // Tag 2 
// String re3 = re1; 


    Pattern p = Pattern.compile(re1+re2+re3,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher m = p.matcher(txt); 
    if (m.find()) 
    { 
     String tag1=m.group(1); 
     String var1=m.group(2); 

     System.out.println(tag1.toString()); 
     System.out.println(var1.toString()); 
    } 

문제는 첫 번째 태그 만 식별하고 두 번째 태그는 식별하지 않는 것입니다.

반면에 경우 전류 출력

TRIPS 
100 

원하는 출력

TRIPS 
100 
DATE 
December 
ROUTE 
Altantic 
+0

사용 ['<([^>] *)> (*) <\/\1>'] (https://regex101.com/r/oLvTL9/ 1) & 두 번째 그룹을 추출하십시오. – Tushar

+1

'if (m.find())'를 while (m.find())로 변경하십시오. – Mariano

+0

올바르게 ''과 같이 TRIPS 요소를 닫고 주석 처리 된 re3 버전을 사용하십시오. 그렇지 않으면 올바르게 닫힌 다른 요소와 일치시킬 수 없습니다. –

답변

1

변경하십시오

String txt = "American Airlines made <TRIPS> 100 <TRIPS> flights in <DATE> December </DATE> over <ROUTE> Altantic </ROUTE> "; 

      String re1 = "<([^>]+)>"; // Tag 1 
      String re2 = "([^<]*)"; // Variable Name 1 
    // String re3="</([^>]+)>"; // Tag 2 
      String re3 = re1; 

      Pattern p = Pattern.compile(re1 + re2 + re3, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
      Matcher m = p.matcher(txt); 
      while (m.find()) { 
       String tag1 = m.group(1); 
       String var1 = m.group(2); 

       System.out.println(tag1.toString()); 
       System.out.println(var1.toString()); 
      } 
1

당신이 XML을 구문 분석하는 방법을 찾고이 게시물에 제공된 경우 , 이것을 읽지 마라. 대신 XML 파서를 사용하십시오.


솔루션 :

변경 while (m.find())if (m.find()). 모든 일치 항목을 찾기 위해 반복 할 수 있습니다.

이 모든 정규식 일치 찾을 수있는 일반적인 경우이다.?

Pattern p = Pattern.compile(regex,flags); 
Matcher m = p.matcher(text); 
while (m.find()) 
{ 
    System.out.println("First group: " + m.group(1) + 
         "\nSecond group: " + m.group(2)); 
}