정규표현식 004. 정규표현식이란?

조회 수 8495 추천 수 0 2012.01.05 11:23:46

어느 에디터, 워드프로세서나 찾기, 바꾸기 기능은 갖고 있습니다. 하지만 대개는 단순히 텍스트를 검색하고 바꾸는 정도입니다. 마이크로소프트 워드도 마찬가지여서 찾을 내용이 조금만 복잡해지면 바로 항복입니다. 예를 들어볼까요?


어느 텍스트가 주어져 있다 치고 그 텍스트에서 ‘www.daum.net’이라는 문자열을 찾는 일은 너무 쉽습니다. 하지만 동시에 www.naver.com도 찾아야 한다면? “무슨 방법이 있지 않겠어? 명색이 MS 워드인데” 하신다면 틀렸습니다. 워드 할애비라도 안 됩니다. 물론 ?글에서도 안 됩니다.


그런데 이 두 문자열을 가만 보면 뭔가 공통점이 있습니다. 바로 패턴입니다. 영문자가 몇 글자씩 덩어리를 이루고 있으며 그 덩어리는 마침표로 구분되어 있다는 패턴 말입니다.


이처럼 패턴을 추출해낼 수 있는 문자열이 있고 그 문자열을 대상으로 검색과 치환 작업을 할 때 사용되는 것이 바로 정규표현식(Regular Expression)입니다. 이 글에서는 다소의 귀차니즘상 정규식으로 표기하겠습니다.


우선 몇 개의 정규식을 보겠습니다.


[a-z].[0-9]\b

[\w.]+@\.\+

[A-Z]{1,2}\d+.[AQO-W]{2}


완전 달나라 언어 같죠? 근데 저것도 손에 익히다 보면 유창해진답니다. 그나저나 백슬래시 문자를 한글 코드 체계에서는 왜 \로 표현하는 걸까요? 누군가가 한글화하는 과정에서 우리나라 돈 표시가 필요하다고 해 넣은 모양인데 저 글자만 들어가면 W랑 헷갈리는데다 미관상으로도 지저분해 보여서 영 그렇습니다. 백슬래시를 저런 식으로 처리한 사람을 보면 저는 꼭 새총을 쏴주겠습니다. 여기서 새는 bird가 아니고 new입니다. 아시겠죠? 에구 무셔라.


위의 정규식이 복잡해 보이긴 하나 그래 봤자 저 글자들은 일반문자 아니면 메타문자 이렇게 두 가지로 나뉩니다.


일반문자는 그냥 문자입니다. 즉 찾고자 하는, 또는 바꾸고자 하는 문자 그 자체입니다. ‘동해물과 백두산이 마르고 닳도록’이라는 문자열에서 ‘백두산’을 찾는다면 이 ‘백두산’이 바로 일반문자입니다.


메타문자는? 이제 너무 쉽죠. 일반문자가 아니면 다 메타문자일테니까요. 이 메타문자들은 정규식에서 특별한 의미를 갖는, 일종의 기능어 또는 명령어라고 보시면 됩니다. 가령 마침표(.)입니다. 정규식에서 마침표는 어느 한 글자라는 의미를 갖습니다. 그러니까,


a.c


위와 같은 정규식이 있다면 이것은 abc와도 매치되고 aqc, a3c, a-c, a@c와도 매치됩니다. 다만 aqwec와는 매치되지 않습니다. 마침표는 아무 글자나 되지만 대신 한 글자만 되기 때문입니다.


여기서 하나의 의문이 들 수 있습니다. “마침표 그 자체를 찾으려면 어떻게 하지?”라는... 이때는 또 다른 메타문자를 써야 합니다. 이 메타문자는 백슬래시입니다. 즉 \.라고 쓰면 마침표 그 자체를 의미합니다. 그러니까,


a.c\.


위의 정규식은 abc., ajc., a-c. 등과 일치합니다.


이때 백슬래시는 따로 이스케이프 문자라고 부릅니다. c언어나 php, 자바 등에 익숙하신 분이라면 너무도 친숙한 용어일 것입니다. 이스케이프는 아다시피 탈출이라는 뜻입니다. 그러니까 원래의 글자를 탈출해서 다른 뜻을 갖게 된다는 의미입니다.


말이 나온 김에 이스케이프 문자 하나만 더 보겠습니다. \n입니다. c언어 등에서 개행문자로 쓰이는 문자입니다. 개행이란 행을 연다는 것으로 줄바꿈, 엔터, 리턴에 해당합니다. 아무튼 n 그 자체는 그냥 하나의 문자이지만 앞에 백슬래시를 붙임으로써 완전히 다른 의미로 사용됩니다.


여기서 좀 헷갈리지 않으시나요? “마침표는 원래 특별한 기호인데 이스케이프 문자를 붙여서 일반문자로 만들더니 n은 원래 일반문자인데 이스케이프 문자를 붙여서 특별한 기호로 만들잖아”라고 말입니다. 그렇습니다. 그래서 이스케이프, 즉 탈출 문자인 것이지요. 이 문자만 붙었다 하면 원래의 의미를 잃어버리니까요. 나중에 보실 정규식의 특수 기호, 가령 [ { 등도 그 앞에 이스케이프 문자만 붙이면 일반문자, 즉 원래의 문자로 변해버립니다.


영문자 앞에 백슬래시를 붙여서 만들어지는 메타문자는 사실 몇 가지 안 됩니다. \n 외에 \d(숫자) \w(영숫자) \r(리턴) \t(탭) [\b] 정도가 일반적으로 쓰이는 전부입니다. 이밖에 \f(폼피드) \v(수직 탭)도 있지만 쓸 일은 거의 없습니다.


참고로 앞에 나왔던 다음과 네이버 URL을 동시에 찾는 정규식을 알아보죠.


\w+\.\w+\.\w+


위와 같이 됩니다. 그런데 위의 식으로는 www.moneybook.co.kr은 찾지 못합니다. 아니, 찾기는 찾는데 맨 끝의 .kr은 빼놓고 찾습니다. 그럼 어떻게 하느냐고요? 한번에 밥 한 솥을 다 먹으면 체합니다. 차츰차츰 알아가기로 하고 일단은 리뷰 리뷰 리뷰~


List of Articles
번호 제목 글쓴이 날짜 조회 수
9 정규표현식 009. 메타문자 4 머니북 2012-01-10 7545
8 정규표현식 008. 메타문자 3 머니북 2012-01-09 8604
7 정규표현식 007. 메타문자 2 마라톤맨 2012-01-08 13366
6 정규표현식 006. 메타문자 1 마라톤맨 2012-01-07 9970
5 정규표현식 005. 근데 어디다 쓰는 것인고? 마라톤맨 2012-01-06 7637
» 정규표현식 004. 정규표현식이란? 마라톤맨 2012-01-05 8495
3 정규표현식 003. 맛보기 울트라 수퍼 심화 단계 마라톤맨 2012-01-04 7495
2 정규표현식 002. 맛보기 심화 단계 마라톤맨 2012-01-03 7669
1 정규표현식 001. 맛보기 마라톤맨 2012-01-02 9231