지난 10여 년간 정규표현식은 놀랍도록 대중화되었다. 오늘날 모든 주류 프로그래밍 언어에는 강력한 정규표현식 라이브러리가 들어있으며, 심지어 정규표현식 기능이 자체적으로 내장돼 있는 언어도 있다. 많은 개발자들은 이러한 정규표현식 기능들을 이용하여 사용자가 정규표현식을 통해 자신의 데이터를 검색하고 필터링할 수 있는 애플리케이션을 제작한다. 정규표현식이 빠지는 곳은 거의 찾아볼 수 없다.
시중의 많은 책들이 정규표현식 채택이라는 대세를 등에 업고 출간되었다. 대부분의 책에는 몇몇 예제와 자료를 통해 정규표현식 문법 설명은 잘 되어 있지만, 컴퓨터상에서나 인터넷 애플리케이션 내에서 텍스트를 처리하는 폭넓은 실무 과제에 대해 정규표현식을 이용한 답안을 제시하는 책은 단 한 권도 존재하지 않는다. 필자(스티브와 잰)는 이 책을 통해 독자들의 그러한 결핍 부분을 채워주기로 결심했다.
특히 필자는 정규표현식 경험이 별로 없는 사람들이 불가능하다고 말할만한 상황이나 소프트웨어 순수주의자들이 정규표현식은 업무에 적절치 않은 도구라고 말할법한 상황에서 정규표현식을 어떤 식으로 사용하는지 보여주고자 하는 의도가 있었다. 정규표현식은 오늘날 사용되지 않는 곳이 없기 때문에 최종 사용자가 원하기만 하면 프로그래머 팀을 구성하지 않고도 직접 사용할 수 있게 툴로 제작돼 있는 경우가 많다. 심지어 프로그래머조차도 일일이 코딩하자면 수십 시간에서 수일이 걸릴 작업이나, 혹은 사전 검토와 관리 승인이 필요한 타사 라이브러리를 사용해야 하는 정보 검색이나 치환 작업에 약간의 정규표현식을 사용해서 시간을 절약하는 경우가 많다.
다양한 스타일 간의 미묘한 차이를 포착
IT 업계에서 대중화되는 모든 것들이 다 그렇듯, 정규표현식 역시 구현 방법이나 호환성의 정도가 매우 다양하다. 그 결과 다양한 정규표현식 스타일이 파생되다 보니, 한 정규표현식 스타일이 다른 정규표현식에서는 조금 다르게 동작하거나 아예 전혀 다르게 동작하게 되었다.
시중의 많은 서적들에도 여러 정규표현식 스타일의 존재가 언급되어 있으며 수많은 차이점 중 일부가 설명돼 있다. 그러나 대부분의 책에는 특정 스타일들이 구석구석 설명돼 있지 않다. 그런 책들은 어떤 스타일에 특정 기능들이 빠져 있는데도 별도의 대안이나 편법조차 알려주지 않는다. 이 때문에 다른 애플리케이션이나 프로그래밍 언어에서 다른 정규표현식 스타일을 사용해야 할 경우 막막해진다.
책에 별 생각 없이 “현재 모든 사람이 펄 스타일의 정규표현식을 사용한다.” 같은 문장이 적혀 있으면 이를 보고 독자는 갖가지 비호환성을 원래 그런 것이려니 하고 오해하게 된다.
‘펄 스타일‘ 패키지 자체 내에서만도 중요한 차이들이 존재하는데다가 펄 버전도 계속 업데이트 되어 간다. 지나치게 일반화한 단순 설명으로 인해 프로그래머들은 정규표현식 작성의 미세한 차이도 알아보지 않고 도대체 왜 안 되는지 몰라 쓸데없이 디버거만 실행하느라 30분을 허비할 수도 있다. 사용하는 일부 기능이 존재하지 않음을 뒤늦게 알아차리게 되더라도 그것을 어떤 편법으로 해결해야 할지 알 길이 없다.
이 책은 가장 널리 쓰이며 다양한 기능을 지닌 정규표현식 스타일들을 완벽 치밀하게 집대성해 펴낸 시중에서 유일한 첫 번째 서적이며, 그러한 치밀함은 이 책의 처음부터 끝까지 일관된다.
대상 독자
이 책은 컴퓨터에서 텍스트 작업을 주로 하는 사람에게 필수 아이템이다. 수많은 문서들 내부를 검색하는 사람, 텍스트 편집기에서 텍스트를 조작하는 사람, 텍스트 검색이나 조작이 필요한 소프트웨어를 개발하는 사람, 너나할 것 없이 반드시 이 책을 읽어야 한다. 정규표현식은 그런 사람들에게 더할 나위 없는 유용한 도구다. 『한 권으로 끝내는 정규표현식』을 읽으면 정규표현식에 대해 필요한 모든 지식을 마스터하게 된다. 정규표현식의 가장 기초적인 사항까지도 이 책에선 일일이 설명하기 때문에 독자는 아무런 사전지식도 필요치 않다.
정규표현식을 사용해본 경험이 있는 사람은 타 서적이나 온라인 게시물에 얼렁뚱땅 설명돼 있는 세부적인 내용들이 이 책에는 상세히 모두 설명돼 있음을 알게 될 것이다. 한 애플리케이션에서 정규표현식을 잘 사용하다가 다른 애플리케이션에서 그걸 그대로 사용하려니 막혔던 경험이 있는 사람은 이 책이 업계에서 가장 보편적으로 사용되는 7가지 주요 정규표현식 스타일 각각을 동등한 비중으로 세심하게 설명해 놓았음을 알게 되어 감탄하게 될 것이다. 이 책은 cookbook의 전형적 문답 형식으로 구성돼 있어서 독자는 필요한 부분으로 즉시 건너뛰어 해당 주제만 읽을 수 있다. 이 책을 처음부터 끝까지 정독한다면 그 사람은 세계에서 손꼽히는 정규표현식의 제왕이 될 것이다.
이 책에는 프로그래머든 아니든 상관없이 모든 독자가 정규표현식에 관해 알아야 할 필수 사항이 하나도 빠짐없이 담겨있다. 텍스트 편집기, 검색 툴, ‘regex’라는 이름의 인풋 박스가 들어있는 애플리케이션 등에 정규표현식을 사용하고자 하는 사람은 프로그래밍 경험이 전혀 없어도 단지 이 책만 읽으면 그것으로 족하다. 이 책에 들어있는 대부분의 절들에는 하나 이상의 순수 정규표현식만을 이용한 문제 해결 방법이 들어있다.
프로그래머인 사람은 정규표현식을 소스코드 안에 구현하는 데 필요한 모든 정보를 3장에서 습득할 수 있다. 3장은 독자가 자신의 주력 언어의 기본 기능에 익숙하되 소스코드에 정규표현식을 사용해본 경험이 없을 것임을 전제로 하고 설명한다.
수록된 기술
.NET, Java, JavaScript, PCRE, Perl, Python, Ruby는 그저 뒤표지에 인쇄된 유행어가 아니다. 이 기술들은 이 책에서 다루는 7가지 정규표현식 스타일이다. 이 책은 이 일곱 스타일을 대등한 비중으로 다루고 있다. 우리 필자는 그 정규표현식 스타일들 간에 발견되는 차이들을 낱낱이 설명하기 위해 각별히 심혈을 기울였다.
프로그래밍에 관한 3장에는 C#, Java, JavaScript, PHP, Perl, Python, Ruby, VB.NET 이렇게
8가지 언어별 정규표현식 스타일 예제 코드가 수록돼 있다. 다시 강조하지만 각 절에는 이 8가지 언어에 대한 답안과 설명이 들어있다. 그로 인해 각 장 안에서 다소 중복되는 내용이 있을 수 있으나, 독자가 알 필요 없다고 생각하는 언어에 대한 설명은 그냥 건너뛰면 된다.
이 책의 구성
첫 3개의 장에는 유용한 각종 툴과 정규표현식 사용에 필요한 기초를 심어줄 기본적인 사항이 설명돼 있다. 4장부터 각 장은 텍스트 처리의 한 분야씩 깊이 있게 파고들면서 다양한 정규표현식들을 보여준다.
1장) 정규표현식 소개: 정규표현식의 역할을 설명하고 학습, 작성, 디버깅을 간편화해주는 각종 툴들을 소개한다.
2장) 정규표현식 기본 기술: 효과적인 사용을 위한 주요 가이드라인을 제시하면서 정규표현식의 각 요소와 기능을 설명한다.
3장) 정규표현식을 이용한 프로그래밍: 코딩 기법들을 설명하고 이 책에서 다뤄지는 각 언어별 정규표현식 사용법 예제들을 보여준다.
4장) 유효검사와 형식화: 날짜, 전화번호, 국가별 우편번호 같은 일반적인 사용자 입력이 유효한지 검사하고 이를 특정 형식으로 처리하는 방법을 설명한다.
5장) 단어, 행, 특수문자: 일반적 텍스트 처리 작업, 특정 단어를 포함하거나 포함하지 않은 행 검사 방법에 대해 설명한다.
6장) 숫자: 정수, 부동 소수점 등 각종 형식의 숫자를 인식하는 방법을 설명한다.
7장) URL, 경로, 인터넷 주소: 윈도우나 인터넷 상에서 뭔가를 검색할 때 주로 사용되는 문자열을 분리하고 조작하는 방법을 설명한다.
8장) 마크업과 데이터 상호변환: HTML, XML, CSV, INI 형식의 파일 조작법을 설명한다.
이 책의 표기 규정
이 책에서 사용한 표기 규정들은 다음과 같다.
단독적인 정규표현식이나 애플리케이션의 검색 박스 안에 입력할 때의 정규표현식을 나타낸다. 정규표현식에 들어있는 빈칸은 공백 무시 모드에서를 제외하고는 회색 원형으로 표시된다.
‹‹치환●텍스트››
정규표현식 일치부가 검색치환 과정에서 치환될 텍스트를 의미한다. 치환 텍스트 사이의 공백은 회색 원형으로 표시된다.
일치 텍스트
대상 텍스트에서 정규표현식과 일치하는 부분
⋯
정규표현식에 들어있는 회색 생략부호는 빈 칸을 채워야만 정규표현식을 사용할 수 있음을 의미한다. 빈 칸에 넣을 수 있는 것들은 다음과 같다.
CR, LF, CRLF
박스로 감싸인 CR, LF, CRLF는 \r, \n, \r\n 같은 문자 이스케이프가 아니라 문자열에 들어있는 실제 개행문자를 나타낸다. 그런 문자열을 작성하려면 애플리케이션의 다중 행 편집 컨트롤에서 엔터를 치거나 C#의 축어 문자열이나 Python의 삼중따옴표처럼 소스코드 내의 다중 행 문자열 상수들을 이용하면 된다.
↵
엔터 화살표는 키보드의 리턴키나 엔터키에서도 볼 수 있듯이 출력된 페이지의 폭에 맞추기 위해 개행해야 함을 나타낸다. 소스코드에 텍스트를 입력할 때 엔터를 누르지 말고 전부 한 줄에 입력해야 한다.
이 아이콘은 참고 사항을 나타낸다.
이 아이콘은 유의 사항을 나타낸다.
예제 코드 저작권
독자의 개발에 도움을 주는 것이 이 책의 목적이다. 일반적인 경우 독자는 자신의 프로그램이나 문서에 이 책의 소스코드를 사용해도 된다. 코드의 상당 부분을 개작하지만 않는다면 오라일리에 연락해서 코드 사용 허가를 받지 않고 사용해도 된다. 예를 들어, 이 책에 수록된 몇몇 코드 부분들을 사용하여 프로그램을 작성할 경우에는 사용 허가를 받지 않아도 되지만, 오라일리 서적에 들어 있는 예제 소스코드 자체를 판매하거나 배포하려면 사전에 반드시 본사의 허가를 받아야 한다. 또한 이 책이나 책 내의 예제 코드를 인용해서 다른 이의 질문에 답변하는 것은 허가 받을 필요 없지만, 자신의 프로젝트 문서 내에 이 책의 예제 코드 대부분을 넣을 경우에는 반드시 본사의 허가를 받아야 한다.
인용할 때 출처나 저작권을 표기해 준다면 고마운 일이지만 의무는 아니다. 저작권을 표기할 때는 제목, 저자, 출판사, ISBN을 기록하면 된다. 일례로 “Regular Expressions Cookbook, 잰 고이바에르츠 / 스티븐 리바이선” 또는 “Copyright 2009 잰 고이바에르츠 / 스티븐 리바이선, 978-0-596-2068-7″과 같이 표기하면 된다.
만일 코드 예제 사용 시 정당한 사용 범위를 벗어난 것 같거나 위에 적힌 허가 항목에 위배될까 봐 걱정된다면 주저 말고 permissions@oreilly.com으로 연락하기 바란다.
감사의 글
시종일관 우리 필자가 이 프로젝트에 전념할 수 있게 해준 (주)오라일리 미디어의 편집자 앤디 오럼에게 감사를 전한다. 그 외에도 꼼꼼한 기술 감수로 이 책을 보다 이해하기 쉽고 정확하게 만들어준 제프리 프리들, 자크 그리언트, 니콜라이 린드버그, 이언 모르스에게도 감사를 표한다.







