2011-12-20 2 views
25

나는 이전에 작성한 게시물을 검토하면서 XML을 파싱하는 데 Regex를 사용하지 말 것을 제안하는 사람들이 많다는 것을 알아 차 렸습니다. 이 경우 XML은 상대적으로 간단했고 Regex는 아무런 문제도 제기하지 않았습니다. 나는 또한 많은 다른 코드 포맷을 파싱 했으므로 일관성을 위해서 말이되었다. 그러나 이것이 다른 경우에 문제를 일으키는 지 궁금합니다. 이것은 단지 '바퀴'유형의 문제를 재발 명하지 않습니까?왜 XML을 정규식으로 파싱하는 것이 나쁜 생각입니까?

+0

아마도 파서가 포함 된 수천 개의 xml 파서가 있기 때문에 어쩌면 프로그래밍 언어, 그리고 GTK와 같은 프레임 워크. – ApprenticeHacker

+2

@Michael이 링크를 기다리고 있습니다. – ApprenticeHacker

+4

정규식을 사용하여 예측할 수있는 작은 XML 조각에서 정보를 추출 할 수 있습니다 (문제는 없지만 ** 정규 해석 ** XML 전체를 의미하지는 않습니다). 그것은 오렌지를 껍질을 벗기는 데 볼펜 망치를 사용하는 것과 같습니다. – BoltClock

답변

34

실제 문제는 중첩 된 태그입니다. 중첩 된 태그는 정규 표현식으로 처리하기가 매우 어렵습니다. balanced matching으로 가능하지만 .NET에서만 사용할 수 있으며 다른 몇 가지 기능이 있습니다. 그러나 균형 잡힌 일치의 힘으로도 잘못 배치 된 주석은 잠재적으로 정규 표현식을 버릴 수 있습니다.

예를 들어,이

<div> 
    <div id="parse-this"> 
     <!-- oops</div> --> 
     try to get this value with regex 
    </div> 
</div> 

당신은 정규 표현식으로 시간과 같이 가장자리 케이스를 쫓고, 어쩌면 해결책을 찾을 수 있습니다 ... 구문 분석하는 까다로운 일이다. 그러나 실제로, XML, XHTML 및 HTML 파서가 더 안정적이고 효율적으로 수행되는 특수화 된 요점은 없습니다.

+0

더 어렵게 만들려면 숫자로 된 숫자 엔티티 또는 DTD- 디디 언트 엔티티를 넣어야합니다. – binki

5

여기에 여러 번 언급되어 있습니다. 예 :

Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms

Can you provide some examples of why it is hard to parse XML and HTML with a regex?

그냥 더 답변을 화면의 오른쪽에있는 링크를 따르십시오.

내 결론 : 정규 표현식이 파서하지 않기 때문에,

간단한, 그 도구는 패턴를 찾을 수 있습니다.

(ht | x) ml 파일에서 매우 구체적인 패턴을 찾으려면 계속하십시오. 정규식은 완벽합니다.

그러나 모든 Foo 태그에서 뭔가를 검색하는 경우 다른 순서로 속성이 포함될 수 있습니다 (중첩 될 수 있음). 형식이 잘못되어 (여전히 유효 함) 패턴 일치가 아니기 때문에 구문 분석기를 사용하십시오. 더 이상.

+0

Xpath는 Regex for XML의 일종입니다. 문제는 정규 표현식이 재귀를 이해하지 못한다는 것입니다. –

+0

@AK_ XPath는 일종의 Regex가 아닙니다. * [XPath] (http://en.wikipedia.org/wiki/XPath)는 XML 문서 *에서 노드를 선택하기위한 쿼리 언어입니다. 그것은 정규 표현식과는 아무런 관련이 없습니다. 그리고 나는 네가 내 대답을 이해했는지 의심 스럽다. 문제는 정규 표현식이 재귀를 이해하지 못하는 것이 아니라 [정규 표현식 참조 .info] (http://www.regular-expressions.info/recurse.html)를 참조하십시오. 문제는 (ht | x) ml가 매우 다르게 보이지만 같은 결과를 가져올 수 있다는 것입니다. 많은 노력을 (정규식으로 (ht | x) ml을 구문 분석 할 수 있습니다.) (http://stackoverflow.com/a/4234491/626273), 기존 파서는 훨씬 더 간단합니다. – stema

+0

1. 당신의 추천 내용 ~은 확장 기능입니다. 이들은 ComSci의 의미에서 정규 표현식이 아닙니다. 2. [this] (http://en.wikipedia.org/wiki/Chomsky_hierarchy)와 배경 지식을 읽으십시오. regex에 영향을받지 않는 xml 문서를 공식화하는 것은 쉽습니다. 3. 실제로 XPath와 Xsd를 사용할 수 있습니다 ** Regex로 할 수있는 일들, 유효성 검사와 같이 문서에서 물건을 찾으려면 ** 실제로 사용할 수 있습니다. 그들은 수사적 의미에서 유사합니다 :-) –

3

XML은 정규 표현식 (전문 용어)이 아니므로 정규식을 사용하여 올바르게 구문 분석 할 수 없습니다. 당신은 99 %의 성공률을 보일지 모르지만, 누군가는 당신을 던져 줄 XML을 작성하는 방법을 발견 할 것입니다.

일종의 스크린 스크레이퍼를 작성하는 경우 99 %의 성공률이 적당 할 수 있습니다. 대부분의 응용 프로그램에서는 그렇지 않습니다.

+1

정규 표현식은 처음에는 일반 언어 만 처리하도록 설계되었지만 현대적인 구현에는 둘러보기, 역 참조, 때로는 균형 잡힌 일치가 포함되어있어 좀 더 복잡한 언어로 모험 할 수 있습니다. 하지만 여전히 XML이나 html과 같은 복잡한 것만으로는 충분하지 않다. –

+2

일부 내용을 손상시키지 않는 정규 표현식을 사용하여 XML을 구문 분석하는 것을 본적이 없다. CDATA 섹션). 정규 표현식을 사용할 때 유일하게 받아 들일 수있는 상황은 항상 정상적으로 작동하지 않는지 신경 쓰지 않는 것입니다. –

+0

동의합니다. 나는 한 번 같은 주장을했기 때문에 전체 정규 언어에 대해서 언급하고 싶었습니다. 그리고 나서 나중에 내 실수를 깨달았습니다. –

관련 문제