저자: 『Mastering Regular Expressions, Second Edition』의 저자 제프레이 E. F. 프리에들, 역 송종범
1997년 『Mastering Regular Expressions』 초판을 끝내고 나서 얼마 지나지 않아 야후(Yahoo)에서 근무할 기회가 있었는데 그때 내 업무의 주된 내용은 경제 관련 뉴스와 정보를 관리하고 처리하는 프로그램을 작성하는 것이었다. 그 당시 나는 데이터 분석을 위해 정규표현식을 사용하여 하루 평균 20시간 정도를 일했다.
그렇게 오랫동안 정규표현식을 집중적으로 사용했지만 업무에 치이다보니 정규표현식이 어떻게 발전했는가에 대해 공부할 시간이 없었다. 그래서 『Mastering Regular Expressions』의 개정판을 집필하기로 마음먹고 다시 정규표현식에 관심을 가졌을 때, 나는 정규표현식이 정말 많이 변한 것을 알고 다소 놀랐었다. 처음에는 순진하게도 초판을 약간 손봐서 개정판을 만들면 될 것이라 생각했고(한 3달 정도 들여서), 개정판의 내용을 대부분 HTML과 관련된 예제들로 구성하려 했다. 그러나 일을 시작하고 보니 결국 2년에 걸쳐서 개정판을 쓰게된 셈이 되었다.
새로운 언어
아마도 가장 금방 눈치챌 수 있는 변화는 초판이 나온 이래로 주목받을만한 성과를 이룬 언어를 정규표현식에 포함한 것이라 할 수 있다.
자바(Java)
5년 전만하더라도 자바에 정규표현식 패키지가 없었지만 현재는 흔하게 볼 수 있다. 썬(Sun)은 심지어 자바 1.4 표준으로
java.util.regex를 포함시키기까지 했다. 현재 자바보다 인기있는 것으로 무엇이 있는가? 하고 싶은대로 할 수 있는데는 어떤 것이 더 좋은가? 자바를 사용했을 때의 장점과 단점은 무엇인가?
초판에서는 자바에 대해 언급하지 않았지만 개정판에서는 자바 스펙과 관련된 주제만 따로 모아 챕터을 만들어서 철저한 검증까지 받았다. 이 과정에서 7개 이상의 서로 다른 패키지(인기 있는 아파치 정규표현식과 자카르타 ORO 패키지를 포함)를 살펴봤기 때문에 각자에게 적합한 것을 선택하는데 큰 도움을 줄 수 있을 것이다.
닷넷 프레임워크(.NET Framework)
마이크로소프트를 좋아하든 아니면 싫어하든 간에 비주얼 베이직의 인기는 부인할 수 없다. 닷넷 프레임워크에 속한 정규표현식 패키지로 마이크로소프트는 VB.NET, C#, Visual C++을 비롯하여 이것들과 연결되길 원하는 것들, 심지어 파이썬과 펄에 의해 사용될 수 있는 패키지까지도 제공한다. 일관성도 매력적이지만 보다 중요한 것은 패키지 자체이다. 이 패키지는 강력하고 빠르며, 펄이나 다른 언어와 비교해보았을 때에도 기죽지 않을 수 있다.
다른 패키지와 마찬가지로 장단점이 있는데 가장 큰 단점은 버그까지도 공유한다는 것이다. 닷넷의 정규표현식 전반을 다루는 챕터는 정규표현식을 깔끔하게 설명하고 있으며 마이크로소프트가 패키지와 함께 제공하는 매우 빈약한 문서를 이해하는데 도움이 될 것이다.
기타 다른 언어들
초판에서는 언급하지 않았던 루비(Ruby), PHP,
procmail과 MySQL에 대해 개정판에서는 골고루 다루었다.
옛 언어를 위한 새로운 엔진
개정판이 나올 동안, 파이썬과 Tcl은 완전히 새로운 정규표현식 엔진를 갖게 되었다. 이것들의 인기는 상승했을뿐만 아니라 요즘도 계속되는 추세이다. "펄5와 호환이 된다."
펄 정규표현식 특징의 확산
펄 버전 5는 혁신적인 정규표현식으로 새로운 기반을 만들었을 뿐만 아니라 너무 유용해서 다른 언어로 개발자들을 빼앗기지 않았다. 곧 펄을 제외한 다른 언어들은 "펄5 호환" 정규식 엔진을 갖게 되었고, lazy quantifiers, non-capturing paretheses, inline mod modifier, lookbehind와 free-spcing mode와 같은 사양들을 지원하기 시작했다.
초판에서 이런 사양들은 펄과 관련된 장에서만 다루었다. 그렇지만 2002년에는 펄, 파이썬, PHP, 루비, 닷넷 프레임워크를 비롯한 몇몇 자바 패키지들, tcl 등등에서도 이러한 특장들이 다루어지고 있다. 따라서 이런 사양들은 지금 개정판의 중심에서 "최우선"으로 다루고 있다.
물론 새로 구현된 것이 정확히 펄을 흉내낸 것은 아니며 때로는 더 좋기도 하고 나쁘기도 하다. 이와 동시에 펄 자체는 새로운 것을 추가하고 시간이 오래 걸리는 것을 변형하여 진화했다. 이것은 "펄5 호환"을 실제로는 "결국은 펄 5 버전에 소개된 사양의 일부를 가지는 것"으로 끝난다는 것을 의미하는 것이라 억울한 생각이 들 수도 있다. 그런 사양들이 어떻게 지원되는가는 아직까지도 중요한 문제로 남아있다. 새로운 구성체가 어떻게 작동하는지와 관련된 의미는 이 문제에서 중요하지 않을 수도 있겠지만 구성체를 사용하고자 한다면 정말 중요하게 된다.
초판에서는 이와 같은 문제를 펄만 다루는 챕터에서 논의했으나 개정판에서는 책 전반에 걸쳐 고루 다루고 있으며, 사용자들의 편의에 따라 특정 구현물에 집중할 수 있도록 그 차이점을 잘 설명해놓았다.
펄의 새로운 사양들(그 외 기타 등등)
앞에서 언급한 바와 같이 펄 역시 진화했다. 펄은 5.003이 막 발표된 때 『Mastering Regular Expressions』의 초판이 나왔다. 개정판에서는 펄 5.8을 다루고 있으며 Look behind, atomic grouping, conditionals, embedded code, regex objects, regex overloading,
/gc 변형자, 유니코드 관련 사양들,
$^N,
@-,
@+와 같은 특별한 변수까지도 다루고 있다.
중요한 새로운 사양을 단 한 줄로 압축해서 말해버렸지만 실제로 이 특징들은 엄청난 힘을 가지고 있다. 좀 더 진화된 언어 중 일부가 이런 사양을 갖추고 있으며 이는 구문에 많은 변수가 있음을 뜻한다. 개정판에서 다루었던 정규표현식들 사이에서 예를 들면 어떤 lookbehind가 응용될 수 있는 다른 세 가지의 구문 집합이 있다. (Perl lookbehind 보다 .NET lookbehind가 더 많은 것을 할 수 있다는 것을 알고 있는지? 사실 펄의 lookbehind는 다른 것들 보다 제한적이다.)
펄이 단지 변화의 요람에만 있었던 것은 아니다. 썬의
java.util.regex 패키지도 유니코드 매칭과 소유 수량자(possessive quantifier)를 돕는 법을 소개했고 이는 atomic grouping과 관련이 있다. (사실 썬의 엔지니어들이 필자고 초판에서 그것들이 유용하다고 제안한 것을 참고하여 첨가했으며 실제적으로도 그것들은 아주 유용하다.) 문자 클래스로 문자들을 구체화할 때
java.util.regexp 역시 연산자 집합(
AND,
OR,
INSERSECTION)을 허락하며 매우 훌륭하다. 사람들이 확실한 불확실함으로 걱정한다고 하더라도 .NET 패키지조차 혁신적인 "오른쪽에서 왼쪽으로" 매치 모드를 가지고 있다.
Tcl 정규식 엔진은 평소에는 완전히 다르게 작동하지만 가끔씩 한 가지 형태의 기술로 구현되는 것처럼 보이기 때문에 다른 것들과 구별된다. 물론 개정판에서 적유식 엔진이 구현되는 실제적인 결과와 작동방법을 있게 다루고 있지만 Tcl 엔진이야말로 모든 세계에서 최고로 잘 작동되는 혼합기술이라고 할 수 있겠다.
유니코드
예전에도 유니코드가 있었지만 그 중요성이 지금에서야 부각되었다. 유니코드는 정규표현식에 대한 개념이 아니지만 정규표현식 사용자들이 중요하게 생각하는 문제들을 가지고 있기 때문이다. 실제로도 많은 사람들이 유니코드가 정말로 무엇을 의미하는지 모르고 있는 듯 하다. 종종 "UTF-8", "UTF-16", "USC2"와 혼동하고 있기 때문이다.
개정판에서는 독자를 위해 유니코드 기반의 배경을 간결하게 해설하고 있다. 역시, 코드 요점, 합쳐진 문자, 특성, 블록, 스크립트, 마침표의 개념도 다룬다. 이밖에도 다양한 툴에 지원되는 유니코드 버전들, 유니코드와 관련된 문제들, 어떻게 "풍부한" 정규표현식이 유니코드가 진짜로 존재하는 것을 지원하는지 사이에 다른점이 있어 보인다. 점이 유니코드 문자와 매치되는지, 혹은 코드 포인트인지?
\w가 유니 코드 단어에 관련된 문자인지? "문자에 관련된 워드"의
\w의 개념과
\b와 매치되는지? 문자 클래스가 유니코드 문자를 어떻게 다루는지? 클래스 안에 유니코드 문자들을 포함할 수 있는지? 정규표현식의 나머지?
^와
$가 유니코드 마침표를 아는지? 점은? 이것 말고도 당황한 여러분들에게 도움을 줄 수 있는 많은 문제와 이에 대한 답변이 이 책에 있다.
결과
초판을 만들고 난 후 만족할만한 열성적인 반응과 함께 아주 즐거운 시간을 보냈다. 그러나 시간이 지나면서 이러한 감정이 점점 사라져갔다. 몇 년이 지났지만 이런 일이 다시 일어나리라는 확신이 있다. 초판보다 개정판이 훨씬 알찬 내용을 담고 있기 때문이다. 개정판을 마치게 되어 매우 기쁘다. 여러분이 펄, 자바, VB.NET 이나 파이썬, PHP, C#, 루비를 비롯한 다른 언어로 정규표현식을 프로그래밍한다면 개정판이 실제적인 정보와 도움이 될만한 예제들을 충분히 제공하고 있으며 이 책으로부터 많은 도움을 받기를 바라는 바이다.
제프레이 E. F. 프리에들(Jeffrey E. F. Friedl)은 당시만 하더라도 소수에게만 알려진 "야후!"에 경제 뉴스와 각종 자료에 응용하기 위한 정규표현식 노하우를 전수하기 위해 1997년 실리콘 벨리로 건너가기 전까지 일본 쿄토의 Omron Corporation에서 커널 개발자로 8년간 근무했다.