1. 정규표현이란 무엇인가?

단적으로 말하자면 “몇 개의 문자열을 하나의 형식으로 표현하기 위한 표현방법” 이라고 할 수 있다. 그러면, 왜 이런 표현방법이 유명한가 하면, 이 표현방법(정규표현)을 이용하면 문장 안에서 찾고싶은 문자열을 쉽게 검색하는 것이 가능하기 때문이다.

예를 들어보자.

Windows라고 해도 WINDOWS일지도 모르고, 그 다음에 스페이스가 들어가 있을지 없을지도 모르겠고, 마지막에 버전이 95인지 98인지…

정규표현을 사용하면, 이와 같은 개소리도 한 줄로 표현이 가능하다.

W(indows|INDOWS)?9[58]

이런 느낌으로 한 번에 쓸 수 있다.



2. 정규표현에서 사용되는 특수문자

정규표현에서는 앞에서 설명한 바와 같이 “하나의 형식으로 표현하기 위해” 몇개의 문자에 특별한 의미를 부여한 특수문자를 사용한다.

아래와 같은 특수문자를 정규표현에선 메타문자라고 부른다.

참고로 이 메타문자는 보통의 문자로써도 사용되기 때문에 그럴때는 앞에 \(back slash, escape문자)를 붙여 사용한다.

메타문자 보통문자
. \.
^ \^
$ \$
[ \[
] \]
* \*
+ \+
? \?
| \|
( \(
) \)

한편, \는 \\로 표현한다.



3. 메타문자 사용예


(1) 뭐든지 괜찮은 .

. : 임의의 한 문자를 표현

No. 예문
1. 나는 나입니다
2. 나는 개입니다
3. 나는 바보입니다
4. 나는 바보입니다.

위의 예문에 대해서

    나는 .입니다

예문 1과 2가 일치하게 된다.
조금 응용해 보면,

    나는 ..입니다

예문 3과 일치한다.

그러면, 예문 4와 같이 문자열에 .이 포함되어 있으면??

    나는 바보입니다\.

앞에서 설명했듯이 \을 추가하면 정규표현에서 사용되는 .이 아닌 단순히 문자 .의 의미가 된다.


(2) 행의 시작과 끝 ^ $

^ : 행의 시작이 일치
$ : 행의 끝이 일치

No. 예문
1. 정말 고맙습니다
2. 고맙습니다라고 말하고 싶어
3. 그에게 고맙습니다라고 전해주세요

위와같은 예문에 대해서

    ^고맙습니다

로 검색을 하면, 예문 2가 일치하게 된다.
즉, “고맙습니다”로 시작하는 행만 검색한다.


    고맙습니다$

의 경우, “고맙습니다”로 끝나는 예문 1과 일치한다.


두 가지를 함께 써서 “고맙습니다” 문자만 찾고 싶다면 다음과 같다.

    ^고맙습니다$

어떤 예문과도 일치하지 않게 된다.


(3) 같은 문자의 반복 * + ?

같은 문자의 반복을 나타내는 정규표현에는 *, +, ? 세 가지가 있다. 차이점을 알아보자

* : 0회 이상 연속으로 반복
+ : 1회 이상 연속으로 반복
? : 있거나 없거나 (0회 or 1회)

No. 예문
1. 졸라 쉽네
2. 졸라 쉽네ㅋ
3. 졸라 쉽네ㅋㅋ
4. 졸라 쉽네ㅋㅋㅋㅋㅋㅋ

위의 예문에서

    ^졸라 쉽네ㅋ*$

위와 같이 정규표현을 검색하면 모든 예문이 일치하게 된다.


다음으로

    ^졸라 쉽네ㅋ+$

예문 1은 제외되고 2,3,4가 일치한다.


마지막으로

    ^졸라 쉽네ㅋ?$

예문 1과 2가 일치한다.

여기서 맨처음 (1)의 예문을 조금 응용해보자.

No. 예문
1. 나는 입니다
2. 나는 나입니다
3. 나는 개새끼입니다
4. 나는 바보입니다
5. 나는 내가 누구인지 모르는 바보입니다

위 예문을 모두 찾고 싶다면??

    나는 .*입니다

이렇게 간단히 표현 할 수 있다.


(4) 복수 문자 |

지금까지의 정규표현은 한 문자에 대해서만 대응하는 것 뿐이었다.
이번에는 복수의 연속문자에 대해서 적용되는 정규표현을 알아보자.

| : 둘중 하나가 일치

    한국|일본|미국|스페인|독일

이와 같이 표현하면, 어느 하나라도 일치 하는것을 찾게 된다


(5) 문자 지정 [ ]

[ ] : 괄호안에 있는 문자 어느 하나가 일치

No. 예문
1. 나는 남자입니다
2. 나는 여자입니다
3. 나는 고자입니다

위의 예문에 대해서

    나는 [남여]자입니다

예문 1, 2가 일치하게 된다.
여기서, 다음과 같이 지정하는 것도 가능하다.

    aaa[ABCDEFGHIJKLMNOPQRSTUVWXYZ]bbb
    // 같은 의미
    aaa[A-Z]bbb

두 정규표현은 같은 의미를 같는다.
마찬가지로

    aaa[0123456789]bbb
    // 같은 의미
    aaa[0-9]bbb

이와같이 연속되는 문자의 경우 간략해서 사용 할 수가 있다.
한글 전체는 다음과 같이 표현 가능하다.

    aaa[가-힣]bbb

조금 더 응용해 보면

    aaa[^A-Z]bbb

위와같이 가장 앞에 ^(부정)을 붙이면 이외(以外)의 의미로써 A~Z를 제외한 나머지 문자를 의미한다.
앞에서 살펴본 행의 시작을 의미하지 않는다는 것에 주의하도록

참고로 []안에서 메타문자는 일반문자로 인식한다.


(6) 그룹화 ( )

( ) : 문자열 단위의 그룹화

한 문자가 대상이 아닌 여러 문자열을 대상으로 할때 괄호로 묶어서 표현한다.

    o-+h

위와같은 표현은 앞에서 설명한 바와 같이 o-h, o–h, o—h 등의 문자가 검색 가능 하다.
이것을 다음과 같이 표현하면

    (o-)+h

o-h, o-o-h, o-o-o-h 등의 문자가 검색 가능해 진다.
즉, 괄호에 포함된 o-가 하나의 문자로써 반복을 의미하게 된다.

    내일 나는|너는 집에 돌아 간다
    내일 (나는|너는) 집에 돌아 간다

첫 번째 문장은 ‘내일 나는’과 ‘집에 돌아 간다’로 나뉘어 검색 되지만,
두 번째 문장은 ‘내일 나는 집에 돌아간다’와 ‘내일 너는 집에 돌아 간다’로 나뉘게 된다.


여기에서는 정규표현이 무엇인지 감을 잡기위한, 간단하지만 필수적인 표현들을 위주로 소개하였다.
이를 바탕으로 좀 더 복잡한 패턴을 익히도록 하자.