정규 표현식

Regular expression. 정규식이라고도 부른다. "정규 표현식"이라는 말은 여러 의미로 쓰이지만 공통적으로 특정한 문자열 집합을 표현하는 간결한 수단을 가리키며, 이름에서 알 수 있듯 본래는 이 집합이 정규문법으로 제한되었으나 지금은 별로 그런 제약은 없다. 문자열 처리에 널리 쓰이며 매우 유용하기 때문에 요즘의 거의 모든 프로그래밍 언어는 정규식을 어떤 형태로든 지원하는 게 보통이다.

정규 표현식은 구현체에 따라 그 문법이나 기능에 있어 큰 차이가 있는데, 그 중에서 가장 큰 줄기는 다음과 같다.

두 줄기는 기본 철학이 매우 다른데, 전자는 성능을 위하여 표현력을 많이 희생했으며, 후자는 표현력을 극대화시키기 위해서 성능을 다소 희생한 면이 있다. 실제로 펄 정규식은 NP-난해하며1) 모든 경우에서 최적으로 돌아가도록 구현하는 건 거의 불가능에 가깝다. (그래서 가장 많이 사용되는 경우에 대해서만 최적화하고 있다…)

문법

거의 모든 정규 표현식들은 공통적으로 다음과 같은 문법을 포함한다.

펄 호환 정규 표현식에서는 () 괄호 문법의 맨 첫 문자로 대부분의 메타 문자가 올 수 없음을 악용(?)하여, (?…) 꼴의 문법을 특수한 목적(조건 체크, 임의의 코드 삽입, 설정 변경 등등)으로 사용한다. 펄 5.10 이후로는 명령형으로 사용되는 (*…) 꼴의 문법도 사용한다.

1) Perl Regular Expression Matching is NP-Hard. 심심하면 펄 정규식으로 소수를 체크한다거나 문맥의존문법을 구현해 보시라.