2012-08-30 2 views
0

현재 대학 과제를 진행하고 있으며 정규 표현식에 관한 (가장 간단한) 질문이 있습니다.자바 - 정규식 입력 오류 처리

요약하면; 이 할당은 JSP 및 RESTful 웹 서비스를 사용하는 간단한 RSS 피드 관리자입니다.

나는 현재 (예 <이 > < 공급 > < 이름 > 피드 이름 </이름 > <URI> HTTP 피드 입력 XML 피드 데이터를 수 있도록 저를 필요로하는 과제 사양의 섹션 일하고

: // FEEDuri/</uri > </feed > </feeds > 등 ..) 그리고이 데이터에서 정규식을 통해 FEED NAME & FEEDuri를 추출하십시오.

강사가 근본적인 방법을 제공해 주셨고, RESTful 웹 서비스에서 제대로 구현했다고 생각합니다. 이제 오류 처리를 구현하고 있습니다.

사용자가 입력 한 데이터가없는 경우 오류 처리를 성공적으로 구현했습니다. 내 질문은 이것이다 : (아래)의 예 방법에 따라 , 그것은 피드 형식 입력이 잘못된 경우 경우에 대한 오류 처리를 구현할 수

예 : 여기 &lt; fed> FEED NAME < /fiid> < uro>http://FEEDuri< /pro> XML 태그가 분명히 잘못되었습니다.

정규식은 문자열에서 그룹을 가져옵니다. 정의 된 값 사이에있는 경우 IF는 인수로 전달되어 컴파일 메서드에 전달됩니까?

내 질문을 보완하기 위해, 여기에 기본 (대신 XML 파서의)를 사용하여 우리에게 주어진 방법 :

public static List<Feed> getFeedsFromXml(String xml) { 
     Pattern feedPattern = Pattern.compile("<feed>\\s*<name>\\s*([^<]*)</name>\\s*<uri>\\s*([^<]*)</uri>\\s*</feed>"); 
     Matcher feedMatch = feedPattern.matcher(xml); 

     while (feedMatch.find()) { 
      String feedName = feedMatch.group(1); 
      String feedURI = feedMatch.group(2); 
      feeds.add(new Feed(feedName, feedURI)); 
     } 

     return feeds; 
} 

답변

1

예, 정규식은 문자열의 부분을 일치합니다 그것이 잘 , 일치. 정규식에 "<feed>"이 포함되어 있으면 "<fed>" 또는 "<fiid>"과 같은 문자열이 일치하지 않습니다.

입력 문자열에서 정규식과 일치하는 데이터가 존재하지 않는 경우, feedMatch.find()은 단순히 당신이 전화를 처음 false를 반환, 그래서 아무 것도 while 루프가 실행에있는 것입니다. 이 메소드는, 빈 상태 (empty)의리스트를 돌려 줄뿐입니다.

+0

우수 답변 - 매우 도움이되었습니다. 친절하게 감사드립니다. – AlexM

1

정확한 질문이 무엇인지 잘 모르겠습니다. 내가 올바르게 이해한다면 오류 처리를 구현하고 부적절한 형식의 XML을 깨끗하게 직접 만들고 싶습니다. 여기에는 두 가지 고려 사항이 있습니다. 1) 잘못된 형식의 XML에 대해 오류를보고해야하고 2) 정규식이 올바른 XML과 일치하지 않고 부적절한 XML을 지나치지 않게 건너 뛰기를 원하지 않습니다.

먼저 Matcher.find()이 XML 파서의 단순화 된 버전과 어떻게 작동하는지 살펴 보겠습니다. <feed></feed> 사이의 일치하는 항목을 원합니다. 간단히하기 위해 디스플레이에 결과를 간단하게 인쇄합니다.

코드 :

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexDemo { 

    public static void main(String[] args) { 
     System.out.println("Good XML"); 
     String goodXML = "<feed>CODE-GURU</feed><feed>ALEXM</feed>"; 
     matchFeeds(goodXML); 

     System.out.println("Bad XML 1"); 
     String badXML1 = "<fed>CODE-GURU</feed><feed>ALEXM</feed>"; 
     matchFeeds(badXML1); 

     System.out.println("Bad XML 2"); 
     String badXML2 = "<feed>CODE-GURU</fid><feed>ALEXM</feed>"; 
     matchFeeds(badXML2); 

     System.out.println("Bad XML 3"); 
     String badXML3 = "<feed>CODE-GURU</fid><fiid>ALEXM</feed>"; 
     matchFeeds(badXML3); 
    } 

    public static void matchFeeds(String xml) { 
     Pattern feedPattern = Pattern.compile("<feed>([^<]*)</feed>"); 
     Matcher feedMatch = feedPattern.matcher(xml); 

     while (feedMatch.find()) { 
      String feedName = feedMatch.group(1); 

      System.out.println("Feed Name: " + feedName); 
     } 
    } 
} 

출력 : 예상된다 정확히

Good XML 
Feed Name: CODE-GURU 
Feed Name: ALEXM 
Bad XML 1 
Feed Name: ALEXM 
Bad XML 2 
Feed Name: ALEXM 
Bad XML 3 

은 "좋은 XML"테스트 출력합니다. 그러나 Java 정규 표현식이 어떻게 작동하는지 이해하지 못한다면 "잘못된 XML 1"과 "잘못된 XML 2"가 놀랄 수도 있습니다. Matcher.find()은 "패턴과 일치하는 입력 시퀀스의 다음 하위 시퀀스"를 찾습니다. 즉, 유효한 일치 항목 (있는 경우)을 찾을 때까지 일치하지 않는 항목은 건너 뜁니다.

다행히도 입력이 정규 표현식으로 시작되도록 강제 실행할 수 있습니다. 정규식 시작 부분에 \G을 추가하기 만하면 Matcher.find()이 마지막 일치 항목의 끝에서 정확하게 시작됩니다. 그래서 내 예제에서 정규 표현식은 "\\G<feed>([^<]*)</feed>"이 될 것입니다.