정규 표현식은 재귀 구조를 식별 할 수 없습니다 . 이것이 근본적인 한계입니다.
JSON을 가져 오십시오-매우 간단한 형식이지만 객체에 다른 객체를 멤버 값 (임의로 깊이 포함)으로 포함 할 수 있으므로 구문은 재귀 적이며 정규 표현식으로 구문 분석 할 수 없습니다. 반면에 CSV 는 재귀 구조를 포함하지 않기 때문에 정규 표현식으로 구문 분석 할 수 있습니다.
간단히 말해서 정규 표현식은 패턴 자체를 참조 할 수 없습니다. 당신은 말할 수 없습니다 :이 시점에서 구문의 전체 패턴을 다시 일치시킵니다. 다시 말해서, 정규 표현식은 선형으로 만 일치하며 중첩 패턴의 깊이를 추적 할 수있는 스택을 포함하지 않습니다.
형식이 얼마나 복잡하거나 복잡한 지와는 아무런 관련이 없습니다. S- 표현은 정말 간단하지만 정규식으로 구문 분석 할 수 없습니다. 반면에 CSS2는 매우 복잡한 언어이지만 재귀 구조를 포함하지 않으므로 정규식으로 구문 분석 할 수 있습니다. (재귀 구문이있는 CSS 표현식으로 인해 CSS3에는 적용되지 않습니다.)
따라서 정규식 만 사용하여 HTML을 구문 분석하는 것이 추악하거나 복잡하거나 오류가 발생하기 쉽기 때문이 아닙니다. 그것은 단순히 불가능하다는 것 입니다.
재귀 구조를 포함하는 형식을 구문 분석해야하는 경우 재귀 구조 수준을 추적하려면 스택으로 정규식 사용을 보충해야합니다. 이것은 일반적으로 파서의 작동 방식입니다. 정규식은 "선형"부분을 인식하는 데 사용되고 정규 표현식 외부의 사용자 정의 코드는 중첩 구조를 추적하는 데 사용됩니다.
일반적으로 이와 같은 구문 분석은 별도의 단계로 나뉩니다. 토큰 화는 정규식을 사용하여 입력을 단어, 문장 부호, 대괄호 등과 같은 "토큰"시퀀스로 나누는 첫 번째 단계입니다. 구문 분석은 이러한 토큰이 계층 구조 인 구문 트리로 구문 분석되는 다음 단계입니다.
따라서 정규식으로 HTML 또는 C #을 구문 분석 할 수 없다고 들리면 정규식은 여전히 구문 분석기의 중요한 부분입니다. 정규식 만 사용 하고 도우미 코드는 사용하지 않고 그러한 언어를 구문 분석 할 수 없습니다 .