예전에는 정규 표현식을 만나면 피하거나 돌아서 갔다. 그런 날들이 이어지면서 가슴 어딘가에 응어리가 남는 것을 느끼며 이건 아니라고 혼잣말을 되뇌었지만 그런 모습은 계속되었다. 답답한 시간들이 흐른 후 정규 표현식에 대해 자신감을 갖게 된 날부터 보다 더 적극적으로 개발에 임할 수 있게 되었다. 이 책은 바로 이런 필자의 어려웠던 과거 경험을 바탕으로 썼다.
* 자바스크립트 정규 표현식의 중심
이 책은 자바스크립트의 정규 표현식을 중점적으로 다룬다. 정규 표현식은 자바스크립트 이외의 다른 언어에서도 지원하지만 언어마다 조금씩 차이가 있다. 물론 전체를 망라하여 포괄적으로 다루면 좋겠지만 이는 전문성이 떨어지므로 자칫 잘못하면 남는 것이 없게 된다.
필자의 오랜 경험에 의하면 하나라도 완전하게 접근해야 한다. 그래야 내 것이 되고 실전에 적용할 수 있다. 어설프게 접근하면 이도 저도 아닌 허사가 되고 만다. 점(.) 하나만 잘못 찍어도 다르게 구현되는 것이 프로그램(program)이다. 특히 문장이 아닌 기호 중심으로 구성된 정규 표현식은 더욱 세심한 전문성이 요구된다. 이런 이유로 이 책에서는 자바스크립트의 정규 표현식만 집중적으로 다루었다.
* 문자열 처리에 최적
자바스크립트 애플리케이션(application)에서 정규 표현식은 약방의 감초다. 그렇게 두드러지게 표시가 나지는 않지만 정규 표현식이 없으면 어딘가 부족함을 느낀다. 특히 문자열을 처리할 때 필요성을 절실하게 느낀다. 복잡하게 작성할 코드를 단 몇 줄로 끝낼 수 있으며 때로는 정규 표현식이 아니면 구현할 수 없는 문자열도 있기 때문이다. 값을 검색하고 일치된 값을 지정한 값으로 바꾸는 것은 정규 표현식의 백미이며 아름다움의 극치다.
* 선행 필요 지식
일단 이 책을 읽는 독자는 자바스크립트의 기본 문법을 이해하고 있어야 한다. 만약 독자가 자바스크립트를 전혀 모른다면 이 책을 보기 전에 자바스크립트 책을 먼저 볼 것을 권한다. 정규 표현식은 그 자체로도 실행되지만 자바스크립트와 같이 사용하면 더욱 완전한 형태가 된다.
이 책에서는 정규 표현식과 관련된 자바스크립트를 약간 다루고 있는데, 정규 표현식을 더 명확하게 설명하기 위해 자바스크립트 코드를 포함시켰다. 정규 표현식을 다루려면 어쩔 수 없이 자바스크립트가 동반되어야 한다. 정규 표현식은 독립된 클래스(Class)이지만 이를 실질적으로 사용하는 클래스는 String(문자열) 클래스이며 자바스크립트는 정규 표현식만 단독으로 다룰 수 없는 구조로 되어 있기 때문이다.
* 예제 분류
예제를 되도록 간단하게 하려고 노력했다. 필자의 경험에서 볼 때 코드를 길게 작성하면 그냥 넘어가고 싶은 충동이 일어날 수도 있기 때문이다. 따라서 기본 사항을 중심으로 간단하게 하면서 다양한 각도에서 예제를 다루었다.
기본 사항을 다룬 후에 몇 개의 정규 표현식이 포함된 실제 사용 가능한 코드를 제시하였으며 이를 설명하고 분석하였다. 각 장에서 다룬 내용이 기본 단계라고 한다면 이는 중간 단계에 속한다. 맨 끝의 10장은 마지막 단계로 정규 표현식과 자바스크립트를 통합한 실제로 사용할 수 있는 코드를 중점적으로 게재하고 이를 설명, 분석하였다. 즉 3단계로 나누어 접근하였다.
* 기본이 중요
정규 표현식은 디버깅이 어렵다. 자바스크립트로 작성한 코드는 단계마다 결과를 볼 수 있는 방법이 있지만 정규 표현식은 과정이 아닌 결과밖에 볼 수 없으므로 디버깅이 어렵다. 정규 표현식을 분리하는 것이 유일한 방법이지만 때로는 분리하지 못하는 형태도 있다.
이에 대처하기 위한 가장 근본적인 해결 방법은 기초, 기본을 튼튼하게 하는 것이다. 우선 간단한 것부터 접근해서 기본 사항을 이해하고, 점진적으로 어려운 것에 접근해야 스트레스를 받지 않으면서 실력을 향상시킬 수 있다.
책을 한 페이지씩 넘기면서 기본을 탄탄하게 잡아가면 조금씩 자신감이 생길 것이다. 예제가 간단하므로 직접 작성해 보면서 기본을 이해하고 내 것으로 만든다면, 마지막 페이지를 넘길 때 어렵기만 한 정규 표현식에 자신감을 갖게 될 것으로 확신한다.
이 책의 구성
이 책은 총 10장으로 구성되어 있으며 각 장의 주요 내용은 다음과 같다. 이처럼 상세하게 장을 나눈 것은 정규 표현식 패턴 문자 하나하나가 기능을 갖고 있으므로 이에 집중하기 위함이다. 슬슬 넘겨가면서 보는 형태가 아니라 세밀하게 분석하는 형태이기 때문이다.
정규 표현식의 가장 기본적인 형태를 통해 정규 표현식의 3대 요소와 자바스크립트에서 정규 표현식의 역할을 알아본다. 이 책의 예제를 실행하기 위한 환경과 본문의 기준 형태가 작성되어 있다.
모든 언어는 나름대로 작성 방법이 있으며 정규 표현식 또한 작성 방법이 있으므로 이? 작성하는 방법을 알아본다. 정규 표현식 메커니즘과 자바스크립트 메커니즘을 비교하여 차이점을 정리하였다. 객체지향 관점에서 보면 함수와 메소드는 차이가 있다. 무엇에 차이가 있는지, 정규 표현식에서 사용하는 메소드와 클래스를 알아본다.
정규 표현식에서 가장 단순한 형태는 문자열로 매치하는 형태다. 이를 통해 정규 표현식을 매치하는 기본 형태와 매치되었을 때 반환되는 형태를 알아본다. 정규 표현식에서 자주 사용하는 대체(|), 앞뒤 문자에 매치하는 점(.), 공백 문자, 줄 분리자를 살펴 본다.
자바스크립트의 정규 표현식과 다른 언어의 정규 표현식이 다른 점은 메소드다. 또한 자바스크립트 정규 표현식은 메소드에 따라 매치 결과가 달라진다. 따라서 자바스크립트로 정규 표현식을 구현하려면 반드시 메소드를 이해해야 한다. 자바스크립트에 익숙한 독자라면 익히 알고 있는 메소드이지만 정규 표현식 중심으로 살펴 볼 필요가 있다.
매치할 위치를 지정하여 매치할 수 있다. 이 장부터 본격적으로 정규 표현식 패턴 중심으로 접어든다. 문자열 처음부터 매치(^), 문자열 끝에 매치($), 단어 경계 매치(\b), 63개 문자 매치(\B)가 이에 속한다.
매치 수를 지정하여 매치할 수 있다. 매치 수에 관계없이 모두를 매치하는 패턴, 범위를 지정하여 매치하는 패턴, 욕심 없는 매치를 행하는 패턴을 알아본다. *, +, ?, {숫자} {숫자,}, {숫자,숫자}, *?, +?, ??와 같은 패턴 문자가 이에 해당된다.
범위 또는 집합을 지정하여 매치할 수 있다. 집합에 지정한 문자 단위로 매치하고 패턴 문자를 일반 문자로 인식하는 대괄호[ ], 63개 이외 문자에 매치하는 [\b], 매치 구간을 지정하는 하이픈(-), 지정한 문자를 제외하고 매치하는 [^]에 대해 알아본다. CSS 프로퍼티 이름을 변경하는 사례와 스크립트 형태에서 텍스트를 추출하는 사례를 분석한다.
역슬래시(\)에 연이어 문자를 작성한 형태를 이스케이프 문자 클래스라고 하며 이는 특수한 기능을 갖는다. 일반 문자로 인식하는 \^, 숫자만 매치하는 \d, 숫자 이외에 매치하는 \D, 보이지 않는 문자에 매치하는 \s, 보이는 문자에 매치하는 \S, 63개 문자에 매치하는 \w, 63개 이외 문자에 매치하는 \W, 유니코드에 매치하는 \u, 16진수 값으로 매치하는 \x, 제어 문자를 매치하는 \c에 대해 알아본다. 공백을 체크하는 패턴 사례, 문자열 앞뒤의 공백을 삭제하는 사례, E-Mail 주소를 체크하는 사례를 분석한다.
정규 표현식에서 가장 돋보이는 패턴 문자를 꼽는다면 괄호( )라고 할 수 있다. 매치 결과를 캡처하는 ( ), 캡처하지 않는 (?:), 전방에 매치하는 (?=), 전방 부정에 매치하는 (?!)가 이에 속한다. 다수의 괄호를 사용하면서 괄호 안에 패턴을 작성했을 때 어려움이 가중되지만 그만큼 탁월하게 기능을 구사할 수 있다.
백래퍼런스인 \숫자 형태, 캡처된 값을 참조하는 RegExp.$숫자 형태를 사용해서 괄호( )로 캡처한 값을 참조할 수 있다. 괄호( )와 대체(|) 패턴 문자가 어울린 사례를 통해 최대로 매치하려는 정규 표현식의 메커니즘을 다룬다. 캡처된 값을 활용하여 숫자와 숫자 사이에 콤마를 삽입하는 사례를 분석한다.
자바스크립트는 RegExp 클래스를 통해 정규 표현식을 구현하며 이 클래스에는 두 개의 메소드가 있다. RegExp가 클래스이므로 이를 인스턴스로 생성할 수 있으며 이에 속한 메소드를 호출할 수 있다. 또한 인스턴스에서 제공하는 프로퍼티를 사용할 수 있다.
정규 표현식을 활용하는 사례 중심으로 자바스크립트와 정규 표현식을 설명하고 분석한다. 사례 코드는 필자가 개발한 자바스크립트 라이브러리인 MethodChain에서 발췌한 것으로 즉시 사용할 수 있다. 아울러 역동적으로 정규 표현식 패턴을 만들어 사용하는 개념을 다룬다.
실행 기준 브라우저
이 책의 예제는 다음과 같은 브라우저에 실행했다. 정규 표현식 몇몇 기능에 크로스 브라우저 문제가 있다.
- IE 7.0
- Firefox 3.0.5
- Chrome 3.0
- Safari 3.2.1
- Opera 10.10
소스 코드와 정오표
이 책에 포함된 소스 코드는 예제를 제시하여 설명하기 위함이다. 이를 독자의 소프트웨어에 적용하여 발생하는 문제에 대해서는 필자가 책임을 지지 않는다. 또한 소스 코드 자체를 판매하거나 다른 책에 포함시키는 것과 같은 상업적인 목적에 사용할 수 없다.
이 책을 출판한 후 발견된 정오표는 필자가 운영하는 카페(http://cafe.naver.com/ requirements.cafe)에 게재할 것이며 이 책의 내용에 대한 문의도 카페를 이용할 수 있다.