나는 이전에 작성한 게시물을 검토하면서 XML을 파싱하는 데 Regex를 사용하지 말 것을 제안하는 사람들이 많다는 것을 알아 차 렸습니다. 이 경우 XML은 상대적으로 간단했고 Regex는 아무런 문제도 제기하지 않았습니다. 나는 또한 많은 다른 코드 포맷을 파싱 했으므로 일관성을 위해서 말이되었다. 그러나 이것이 다른 경우에 문제를 일으키는 지 궁금합니다. 이것은 단지 '바퀴'유형의 문제를 재발 명하지 않습니까?왜 XML을 정규식으로 파싱하는 것이 나쁜 생각입니까?
답변
실제 문제는 중첩 된 태그입니다. 중첩 된 태그는 정규 표현식으로 처리하기가 매우 어렵습니다. balanced matching으로 가능하지만 .NET에서만 사용할 수 있으며 다른 몇 가지 기능이 있습니다. 그러나 균형 잡힌 일치의 힘으로도 잘못 배치 된 주석은 잠재적으로 정규 표현식을 버릴 수 있습니다.
예를 들어,이
<div>
<div id="parse-this">
<!-- oops</div> -->
try to get this value with regex
</div>
</div>
당신은 정규 표현식으로 시간과 같이 가장자리 케이스를 쫓고, 어쩌면 해결책을 찾을 수 있습니다 ... 구문 분석하는 까다로운 일이다. 그러나 실제로, XML, XHTML 및 HTML 파서가 더 안정적이고 효율적으로 수행되는 특수화 된 요점은 없습니다.
더 어렵게 만들려면 숫자로 된 숫자 엔티티 또는 DTD- 디디 언트 엔티티를 넣어야합니다. – binki
여기에 여러 번 언급되어 있습니다. 예 :
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 태그에서 뭔가를 검색하는 경우 다른 순서로 속성이 포함될 수 있습니다 (중첩 될 수 있음). 형식이 잘못되어 (여전히 유효 함) 패턴 일치가 아니기 때문에 구문 분석기를 사용하십시오. 더 이상.
Xpath는 Regex for XML의 일종입니다. 문제는 정규 표현식이 재귀를 이해하지 못한다는 것입니다. –
@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
1. 당신의 추천 내용 ~은 확장 기능입니다. 이들은 ComSci의 의미에서 정규 표현식이 아닙니다. 2. [this] (http://en.wikipedia.org/wiki/Chomsky_hierarchy)와 배경 지식을 읽으십시오. regex에 영향을받지 않는 xml 문서를 공식화하는 것은 쉽습니다. 3. 실제로 XPath와 Xsd를 사용할 수 있습니다 ** Regex로 할 수있는 일들, 유효성 검사와 같이 문서에서 물건을 찾으려면 ** 실제로 사용할 수 있습니다. 그들은 수사적 의미에서 유사합니다 :-) –
XML은 정규 표현식 (전문 용어)이 아니므로 정규식을 사용하여 올바르게 구문 분석 할 수 없습니다. 당신은 99 %의 성공률을 보일지 모르지만, 누군가는 당신을 던져 줄 XML을 작성하는 방법을 발견 할 것입니다.
일종의 스크린 스크레이퍼를 작성하는 경우 99 %의 성공률이 적당 할 수 있습니다. 대부분의 응용 프로그램에서는 그렇지 않습니다.
정규 표현식은 처음에는 일반 언어 만 처리하도록 설계되었지만 현대적인 구현에는 둘러보기, 역 참조, 때로는 균형 잡힌 일치가 포함되어있어 좀 더 복잡한 언어로 모험 할 수 있습니다. 하지만 여전히 XML이나 html과 같은 복잡한 것만으로는 충분하지 않다. –
일부 내용을 손상시키지 않는 정규 표현식을 사용하여 XML을 구문 분석하는 것을 본적이 없다. CDATA 섹션). 정규 표현식을 사용할 때 유일하게 받아 들일 수있는 상황은 항상 정상적으로 작동하지 않는지 신경 쓰지 않는 것입니다. –
동의합니다. 나는 한 번 같은 주장을했기 때문에 전체 정규 언어에 대해서 언급하고 싶었습니다. 그리고 나서 나중에 내 실수를 깨달았습니다. –
- 1. Plone의 main_template.pt를 재정의하는 것이 왜 나쁜 생각입니까?
- 2. 왜 Object [] 배열을 사용하는 것은 나쁜 생각입니까?
- 3. SQL Server에 인덱스를 추가하는 것이 나쁜 생각입니까?
- 4. Null 허용 유형으로 캐스팅하는 것이 나쁜 생각입니까?
- 5. 익명 클래스가 나쁜 생각입니까?
- 6. 소멸자를 구하기 - 나쁜 생각입니까?
- 7. 사용자가 정규식으로 쿼리 할 수있게하는 것이 좋은 생각입니까?
- 8. AttributeError : XML을 파싱하는 중
- 9. NullPointerException XML을 파싱하는 동안
- 10. mod_perl2에서 fork하는 것은 나쁜 생각입니까?
- 11. ScheduledActionService.LaunchForTest를 사용하는 것은 나쁜 생각입니까?
- 12. "이것을 삭제 하시겠습니까?"나쁜 생각입니까?
- 13. 이것은 프로그래밍 방식으로 나쁜 생각입니까?
- 14. ViewModels을 집계하는 것이 좋은 생각입니까?
- 15. 한정된 Queue에서 배열을 데이터 구조로 사용하는 것은 왜 나쁜 생각입니까?
- 16. 통신에서 데이터 서식을 지정하기 위해 XML을 사용하는 것이 좋은 생각입니까?
- 17. 원시 데이터를 쿠키에 저장하십시오 - 좋은 생각입니까 아니면 나쁜 생각입니까?
- 18. JFrame을 확장하는 것은 항상 나쁜 생각입니까?
- 19. WxWidgets 및 GTK를 실행하는 것은 나쁜 생각입니까?
- 20. recordId를 해시 코드로 사용하는 것은 나쁜 생각입니까?
- 21. JAXB를 사용하여 XML을 파싱하는 XML
- 22. jquery에서 xml을 파싱하는 소스가 짧아집니다.
- 23. net에서 xml을 파싱하는 방법은 무엇입니까?
- 24. 복잡한 XML을 배열로 파싱하는 TBXML
- 25. ORM없이 ASP.NET MVC를 수행하는 것은 나쁜 생각입니까?
- 26. 이 2D 배열 초기화가 나쁜 생각입니까?
- 27. .Net 솔루션 파일에 마침표를 추가하는 것은 나쁜 생각입니까?
- 28. 모델을 디렉토리로 나누는 것은 나쁜 생각입니까?
- 29. 인덱스가 하나 뿐인 데이터베이스 테이블 ... 나쁜 생각입니까?
- 30. 안드로이드에 SQLite Cursor를 저장하는 것은 나쁜 생각입니까?
아마도 파서가 포함 된 수천 개의 xml 파서가 있기 때문에 어쩌면 프로그래밍 언어, 그리고 GTK와 같은 프레임 워크. – ApprenticeHacker
@Michael이 링크를 기다리고 있습니다. – ApprenticeHacker
정규식을 사용하여 예측할 수있는 작은 XML 조각에서 정보를 추출 할 수 있습니다 (문제는 없지만 ** 정규 해석 ** XML 전체를 의미하지는 않습니다). 그것은 오렌지를 껍질을 벗기는 데 볼펜 망치를 사용하는 것과 같습니다. – BoltClock