Regex 예제 하나


그럼 간단한 예제 하나 해보면서 regex의 맛을 보겠습니다. 도입부에 언급했던 긴~~~ 문서에서 연도를 찾는 걸 해보지요. Regular Expression은 다른 말로 pattern matching이라고도 합니다. 문자속에서 일정한 패턴을 찾는다는 겁니다.

따라서, regex를 쓸때는 어떤 패턴에 적용할지 이 패턴을 머리속에 정의해보는게 중요합니다. 그리고 찾고 바꾸기를 하기전에 반드시 찾기를 먼저 해봐서 내가 생각하는 패턴만을 찾는지 확인해야 합니다. 그래야 엉뚱한 결과를 막을 수 있거든요. 컴퓨터의 모든 부분이 마찬가지지만, regex 역시 면도날과 같아서 좋은 도구가 될 수도 있지만 베일 수도 있다는 뜻입니다.

울트라 에디터 9.0부터는 찾고 바꾸기를 한 것에 대해서도 undo가 가능하니 좀 낫지만 이전 버전에서는 엉뚱하게 바꾸고 나면 정말 하늘이 무너지는 결과를 낳기도 했습니다. 조심 또 조심... 언제나 원본을 백업해 두는 것도 잊지 마세요. 언제나 빠꾸가 가능하도록... :-)

자 그럼 연도의 패턴을 봅시다. 일단 연도는 네자리수만 있지요. 물론 그 이전도 있지만 편의상 여기선 4자리만 따지겠습니다:

* 찾고자 하는 패턴: 1234, 1940, 1999, 2000, 2002 등등

* 정규 표현식: [0-9][0-9][0-9][0-9]

 

원래 유닉스라면 [0-9]{4} 식으로 4자리 반복가능을 직접 지정해 줄 수 있는데 울트라에디터에선 안됩니다. 저렇게 무식하게 해줘야 하지요.

일단 4문자를 찾는다는 건 '[]' 가 네번 반복되기 때문에 알 수 있습니다. '[]' 안에 0-9 가 있으니, 0,1,2,3,4,5,6,7,8,9 만 찾는다는 것도 알 수 있습니다. [0-9] 는 '[0123456789]' 와 의미가 같으니까요. 따라서 당연히 1234, 1940, 1999, 2000, 2002 식의 내자리 숫자만 찾습니다. 좀더 응용해서 "2천년대라는 건 안다..."싶으면 '2[0-9][0-9][0-9]'라고 해주면 되겠지요? 2천 10년대만 찾는다면? 201[0-9] 예술입니다 :-)

지금 실험해보세요. 울트라 에디터에서 CTRL+F 를 눌러 검색 창을 연 다음 (정규식 에 체크하고) 찾기 텍스트 상자에 2[0-9][0-9][0-9] 라고 입력하고 찾아보세요. 그럼 이 문서에 나온 2천년대 숫자만 찾을 겁니다.

Regex 는 Art 다

regex는 art다... 상상력을 동원해보세요. 이것만 가지고도 여러분은 별짓 다할 수 있습니다:

* 응용 패턴 1: 1[0-9][0-9]1 (1231, 1991 식의 연도만 찾기)

* 응용 패턴 2: 19[0-9][0-9] (1900 년대만 찾기)

 

참고로 [0-9]\d 로 대체가 가능하다고 했습니다. 2[0-9][0-9][0-9]2\d\d\d 와 같다는 말입니다.

그럼 바꾸기 해보까요? 지금은 2천년대라 의미가 없지만 20세기에는 80년대, 60년대 식의 표현을 썼습니다. 60은 1960, 80은 1980인거지요.

20세기에 만들어진 1만페이지짜리 문서에 모두 이렇게 돼 있는 겁니다. 이것도 Y2K 버그지요. 90년대 정치상황으로는.... 90년대와서는...

이 문서의 이런 시의성 떨어지는 표현들을 모두 1980년대, 1990년대로 바꾸고 싶으면 어떻게 찾으면 될까요? 쉽지요? :

* 시험 패턴 1: [0-9][0-9]년대

 

해보세요. 아주 잘찾습니다. 근데 너무 잘 찾아서... '1990년대'까지 찾습니다. 아무 생각없이 찾고 바꾸기 해버리면 191990년대 식의 표현도 등장할 수 있다는 겁니다. 그래서 찾기를 먼저해서 실험해 보라는 겁니다. :

* 시험 패턴 2: 공백[0-9][0-9]년대

 

공백은 공백을 표시하기 위한 겁니다. 찾기 창에 공백이라고 쓰라는 게 아니고...

앞에 공백을 하나 넣고 찾아보세요. 이제 1990년대 문제는 사라졌지요? 근데 공백이 아닌 \t 문자가 앞에 있는 '\t90년대'식의 표현은 찾지 못할 겁니다:

* 시험 패턴 3: [ \t][0-9][0-9]년대

 

이럼 다 찾습니다. [ \t] 의 의미는 공백 또는 탭 문자니까요. 이걸 더 쉽게 하려면 '\W[0-9][0-9]년대'라고 해주면 됩니다. 근대 안타깝게도 \W는 한글도 포함됩니다. 한글이 원래 컴퓨터에게는 이상한 특수코드로 입력이 되기 때문에... 그래서 조심하란 겁니다:

* 최종 찾기 패턴: [ \t]([0-9][0-9])년대

 

안전하게 한글을 다치지 않기 위해. 여기 나오는 괄호부분이 나중에 바꾸기에 활용을 하겠다는 뜻입니다.:

* 바꾸기 패턴: 19\1년대

 

\1 은 앞에 괄호로 감싼 부분 [0-9][0-9] 에서 찾은 결과값으로 대체하라는 뜻입니다. 90년대 를 찾았다면 90이 그 값이기때문에 1990년대 로 변환이 되지요.

한번 해보세요. 아니 해봐야 뭔소린지 압니다. 꼭 해보세요. regex의 빠워~를 한번 느껴보세요. 몽땅 바꾸기 하지 말고 하나씩 해보면서 어떻게 찾고 변하는지 보면... regex의 마술을 느낄 수 있을 겁니다. 아니 무한한 가능성... 아... 앞으로 수없는 뺑이를 줄일 수 있겠다는 안도감... 뭐 그런게 느껴지신다면 이 길고 긴 난수표같은 제 글도 더 이상 멍멍 np_icon_dog.gif 만은 아니겠지요 :-)

두번째 예제로 이어집니다.


+ Recent posts