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-
가 하나의 문자로써 반복을 의미하게 된다.
내일 나는|너는 집에 돌아 간다
내일 (나는|너는) 집에 돌아 간다
첫 번째 문장은 ‘내일 나는’과 ‘집에 돌아 간다’로 나뉘어 검색 되지만,
두 번째 문장은 ‘내일 나는 집에 돌아간다’와 ‘내일 너는 집에 돌아 간다’로 나뉘게 된다.