, 여기에 좀 더 문맥의 :
정규 표현식가 호출된다 "일반"그들은 (무제한) 정규 문법과 관련된하고 있으며, 일반 문법 설명 할 수 없기 때문에 중첩 된 괄호 (그들은 임의의 괄호를 설명 할 수는 있지만 깔끔한 쌍으로 일치시킬 수는 없습니다.
이것을 이해하는 한 가지 방법은 정규 표현식이 최종적으로 설명 할 수있는 몇 가지 세부 사항을 결정 론적 유한 자동 장치로 변환 할 수 있다는 것을 이해하는 것입니다. 위협적으로 들리 겠지만 실제로는 규칙이 "규칙"목록으로 변환 될 수 있다는 것을 의미합니다. 여기서 규칙은 사용자가 일치시킨 것에 달려 있으며 일치 할 수있는 것을 설명합니다.
예를 들어, 정규 표현식 ab*c
가 변환 할 수 있습니다 : 시작에
만 a
을 일치시킬 수 있습니다. 다음 지금, 당신이 b
을 일치시킬 수 있습니다 2.
에 가서 2로 다시 이동하거나 일치 c
을하고 완료 3
로 이동합니다! 성냥은 성공이었다!
이며 "결정 론적 유한 오토마타"입니다.
어쨌든이 흥미로운 부분은 앉아서 괄호 쌍과 일치하는 것을 만들려고 시도 할 수 없다는 것입니다. 시도 해봐. 당신은 더 많은 규칙을 만들어 유한 수를 매치 할 수 있지만 괄호의 무제한 수와 일치하는 일반적인 규칙 집합을 작성할 수 없습니다 (규칙은 "X가 일치하면 규칙이 양식에 추가되어야 함을 명심해야합니다 ~ Y ").
이제 분명히 다양한 방법으로 수정할 수 있습니다. 보다 복잡한 규칙 (예 : 괄호 수를 늘릴 수 있도록 규칙을 확장하는 것)을 허용하면 원하는대로 작동하는 것을 얻을 수 있습니다. 정규 문법은 아닙니다.
정규 표현식이 이런 식으로 제한된다는 점을 감안할 때 왜 더 복잡한 것이 아닌 사용되는 이유는 무엇입니까? 그것들은 꽤 좋은 곳이라는 것이 밝혀졌습니다. 그들은 아주 간단하고 효율적으로 많은 것을 할 수 있습니다. 더 복잡한 문법 (규칙의 종류)은 더 강력 할 수 있지만 구현하기가 더 어렵고 효율성에 더 많은 문제가 있습니다.
최종 면책 조항 및 약속 된 추가 세부 정보 : 실제로 많은 정규 표현식이 요즘 실제로 은이며 실제로는 "정규식"이라고해서는 안됩니다. 하지만 위의 내용은 여전히 정규 표현식을 사용하지 말아야하는 이유에 대한 기본적인 설명입니다.
ps jesse의 제안 솔루션은 regexp를 여러 번 사용하여이 문제를 해결합니다. 여기에있는 인수는 정규 표현식을 한 번 사용하는 것에 대한 것입니다.
파서? .......... –
['r "\ (. + \)"는 일치하지 않습니다.] (http://ideone.com/oJQjV) – Amber