레귤러 익스프레션(Regular Expression, 정규식)은 유닉스 사용자들만 알고 있었던 것이기도 하다. vi와 같은 텍스트 에디터에선 레귤러 익스프레션 형식의 검색을 이용한다. 하지만 윈도 기반의 에디터에선들은 대부분 이런 방식을 사용하지 않는다. 마이크로소프트는 윈도 기반의 스크립팅 랭귀지를 개발할 당시 JScript만이 레귤러 익스프레션을 지원하였다. 하지만 VBScript 엔진 버전 5부터는 레귤러 익스프레션을 사용할 수 있게 하였다.
혹시 '레귤러 익스프레션이 무엇인지도 모르겠고, 알 필요도 없다'고 생각하는 사람들이 있을지 모르겠다. 하지만 이 기회에 꼭 레귤러 익스프레션이 무엇인지 익히길 권하고 싶다. 왜냐하면 그 기능을 익히고 나면 여러 모로 사용할 곳이 많을 정도로 레귤러 익스프레션의 기능은 막강하기 때문이다.
그렇다면 레귤러 익스프레션이란?
레귤러 익스프레션이란 기술적으로 복잡한 패턴 검색을 위해 정의한 문법을 의미한다. 레귤러 익스프레션을 사용하면 문자열들 중에서 원하는 문자열을 상당히 빠르게 찾거나 대치시킬 수 있다. 레귤러 익스프레션을 이해하기 위해서는 익숙해져야 할 몇 가지 매칭이 있다. 그것은 바로 캐릭터 매칭(character matching), 리피티션 매칭(repetition matching), 포지션 매칭(position matching) 등이 그것이다.
캐릭터 매칭 (character matching)
캐릭터 매칭이 가장 쉬우므로 이것부터 익혀보도록 하자. 예를 들어, "korea"란 문자열을 찾는다고 가정해 보자. 이럴 경우의 레귤러 익스프레션은 단순히 다음과 같을 것이다.
korea |
그렇다면 다음의 예를 한번 보자:
k.rea |
위의 예를 보면 korea의 'o' 대신 '.'을 사용하였다. 바로 이것은 레귤러 익스프레션에서 특별한 문자로 그 '.' 대신 뉴 라인(new line)을 제외한 어떤 문자도 올 수 있음을 의미한다.즉, k.rea는 k1rea, kerea, kirea, kurea 등등의 문자열을 반환할 수 있다는 것이다.
또한 캐릭터 매칭을 이용하여 korea1, korea2, korea3, korea4와 같은 문자열을 찾고 싶을 때에 다음과 같은 레귤러 익스프레션을 사용할 수가 있다.
korea[1234] |
위의 예는 korea 다음에 1, 2, 3, 4중 하나가 오는 문자열을 찾아낼 수가 있다. 그렇다면 0~9 사이의 어떤 값이라도 나오면 그 문자열을 찾고 싶다고 했을 땐 어떻게 할 수 있을까? 그것은 바로 다음과 같이 해주면 된다.
korea[0-9] |
꽤나 간단하다. 만일 [a-m]이라고 한다면 소문자 a부터 소문자 m까지의 문자열을 의미한다.
리피티션 매칭 (repetiotion matching)
레귤러 익스프레션의 가장 강력한 기능은 바로 리피티션 매칭에 있다. 리피티션 매칭의 한 예로 korea나 korean 모두를 찾고 싶은 경우를 들 수 있다. 앞의 캐릭터 매칭에선 특수 문자로 '.'을 사용하였는데 여기서는 특수 문자로 '?'을 사용하면 된다.
korea? |
위의 식을 통해 korea나 korean 모두를 찾을 수가 있다. 만일 그렇다면 'korea?'와 같이 찾고 싶은 문자열 안에 물음표 같이 특수 문자가 포함되어 있을 땐 어떻게 레귤러 익스프레션을 구성해야 할까? 간단하다. 특수 문자 앞에 '백슬래쉬(\)를 붙여주면 된다. 예를 들어 'korea?'란 문자열을 찾고 싶다면 다음과 같이 해주면 된다.
korea\? |
또 다른 특수 문자로 애스터리스크(*)를 들 수 있다. 이 특수 문자를 사용하면 '*' 대신 0개 이상의 어떤 문자열도 올 수 있음을 의미한다. 예를 들면 다음과 같다.
korea* |
위의 식은 korea, korea1, koreaaa, koreaannnn 등 '*' 대신 어떤 문자열도 올 수 있음을 나타낸다.
또 하나의 다른 예를 살펴 보자. 다음과 같이 어떤 문자열을 묶기 위해 괄호를 사용한 예이다.
ko(rea)* |
위의 예는 ko, korea, korearea, korearearea 등의 문자열을 찾을 수가 있다. 즉, 'rea'를 묶어서 그 문자열이 반복되어 나타나는 것을 찾을 수 있다는 것이다.
리피티션 매칭의 마지막 예로 다음을 들 수 있다.
k{3}orea |
위의 예는 'k' 라는 문자가 정확히 3번 반복된다는 것을 의미한다. 즉, kkkorea란 문자열을 의미한다.
포지션 매칭 (position matching)
마지막으로 살펴볼 것은 바로 포지션 매칭이다. 여기서 사용할 특수 문자로 '^'와 '$'가 있다. 예를 들어 보자. 만일 'korea'란 문자열이 어떤 문자열들 중에 첫 번째 5문자일 경우에만 결과를 얻고 싶을 때에는 다음과 같이 해주면 된다.
^korea |
만일 반대로 'korea'란 문자열이 어떤 문자열들 중에 마지막 5번째 문자일 경우에만 결과를 얻고 싶을 때에는 다음과 같이 해주면 된다.
korea$ |
레귤러 익스프레션을 사용하기 위해 가장 먼저 해줘야할 일은 regexp 객체를 다음과 같이 생성해 주는 것이다.
Option Explicit '변수 선언 'regexp 객체 생성 |
이제 레귤러 익스프레션을 설명할 때 흔히 나오는 "전화번호" 예제를 살펴 보도록 하자. 만일 다음과 같은 형태의 전화번호가 있다고 가정해 보자.
(xxx)xxx-xxxx |
위의 형식에만 맞는 전화번호를 찾기 위해 다음과 같은 정규식을 만든다.
\([0-9]{3}\)[0-9]{3}-[0-9]{4} |
위의 예에서 살펴볼 것은 바로 백슬래쉬(\)이다. 앞 장에서 설명했던 것처럼 '('나 ')' 가 특수 문자이기 때문에 백슬래쉬를 사용한 것이다.
위의 식은 '('와 ')' 사이에 0~9 사이의 문자가 3개 들어가고, 다시 0~9 사이의 문자가 3개 나온 다음 '-' 문자가 나오고 다시 0~9 사이의 문자가 4개 나오는 것을 찾겠다는 의미이다.
즉 위의 정규식과 정확히 패턴이 일치하는 문자열을 찾겠다는 것이다. 그렇다면 어떤 식으로 위의 정규식을 사용하는가?
regexp 객체는 Pattern 속성을 갖고 있다. 이 Pattern 속성에 다음과 같은 정규식 문자열을 설정해 주면 된다.
objRegExpr.Pattern = "\([0-9]{3}\)[0-9]{3}-[0-9]{4}" |
위의 코드에서 IgnoreCase 속성이 있는데 이것을 True로 설정하면 대소문자 구분을 안하겠다는 것이다. 디폴트는 false로 설정되어 있다. 또 다른 속성으로 Global이 있다. 정규식과 일치하는 문자열을 한 번만 찾을지 아니면 여러 번 찾을 지를 결정하는데 이 값이 true이면 여러 번 찾고 false면 처음 나오는 것만 찾고 끝낸다.
regexp 객체는 3개의 메쏘드를 갖고 있다. 여기서는 그 중 Execute 메쏘드에 대해서만 살펴볼 것이다. 이 Execute 메쏘드는 Pattern 속성에 정의된 정규식 패턴과 일치하는 문자열을 찾아 준다. 이 메쏘드는 그 결과 값을 컬렉션(collection)으로 반환한다.
실제 예를 살펴 보자.
'찾을 대상이 되는 문자열 '결과 값을 저장할 컬렉션 변수 선언 '레귤러 익스프레션 검색 수행 |
위의 코드를 보면 strSearchOn이란 변수에 찾을 대상이 되는 문자열이 저장되어 있고, Execute 메쏘드를 통해 레귤러 익스프레션 검색을 수행함을 볼 수 있다. 그 결과 값은 colMatches란 컬렉션 변수로 받는다. 위의 예에서는 앞에서 Pattern 속성에 정의한 레귤러 익스프레션과 일치하는 문자열이 두 개가 있다. 즉, '(123)654-3211'과 '(873)392-1222'가 바로 그것이다.
이제 찾아낸 문자열을 화면에 표시해 보도록 하자.
Dim objMatch |
위의 코드는 레귤러 익스프레션에서 정의한 패턴과 일치하는 문자열이 몇 개인지 알려준 후 실제 발견한 문자열을 화면에 표시해줄 것이다.
'컴퓨터' 카테고리의 다른 글
| 윈도우의 최대절전모드 (0) | 2006/12/12 |
|---|---|
| 비유사성(dissimilarity)의 측정 (0) | 2006/10/30 |
| 데이터마이닝 기법 : 군집분석 (0) | 2006/10/30 |
| TF-IDF (0) | 2006/10/27 |
| 상호정보척도 Mutual Information (0) | 2006/10/27 |
| 정규표현식 (0) | 2006/10/23 |
| JSP, PHP, ASP, CGI 비교 (0) | 2006/10/16 |
| 웹 프로그래밍 언어 비교 : Perl, ASP, PHP, JSP (0) | 2006/10/16 |
| 최대 절전 모드의 시작과 끝 (0) | 2006/10/02 |
| XP 에서 응용 프로그램 실행 속도 올리기 (0) | 2006/07/26 |
| 색으로 보는 커뮤니케이션 (0) | 2006/07/20 |