지긋지긋한 정규표현식을 부셔보자
정규식에서 사용하는 메타문자(meta characters)에는 다음과 같은 것이 있다.
. ^ * + ? { } \ | ( )
정규식에서 위 메타 문자를 사용하면 특별한 의미를 갖게 된다.
대부분 키보드에서 이런 문자가 왜 있지? 싶었던 것들이 대부분이다. 그래서 정규표현식은 읽기 힘들다 ㅜ
[ ]
문자 클래스로 만들어진 정규식은 [ ] 사이의 문자들과 매치
라는 의미를 갖는다.
즉 정규표현식이 [abc]
라면 이 표현식의 의미는 "a, b, c"중 한 개의 문자와 매치를 의미한다.
예시를 보면서 이해해보자.
[ ]
안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위(from - to)를 의미한다.
예를 들어 [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일하다.
다음은 하이픈(-)을 사용한 문자 클래스의 사용 예이다.
문자클래스
[]
안에는 어떤 문자나 메타 문자도 사용할 수 있지만 주의해야 할 메타 문자가 1가지 있다.
그것은 바로^
인데, 문자 클래스 안에^
메타 문자를 사용할 경우 반대(not)라는 의미를 갖는다.
예를 들어 [^0-9]라는 정규식은 숫자가 아닌 문자만 매치된다.
[0-9]
또는 [a-zA-Z]
등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다.
\d
- 숫자와 매치, [0-9]
와 동일한 표현식이다.\D
- 숫자가 아닌 것과 매치, [^0-9]
와 동일한 표현식이다.\s
- whitespace 문자와 매치, [ \t\n\r\f\v]
와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.\S
- whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.\w
- 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]
와 동일한 표현식이다.\W
- 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]
와 동일한 표현식이다.아래 정규식을 보자
a.b
위 정규식의 의미는 다음과 같다.
"a + 모든문자 + b"
즉, a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
아래 예시를 보며 이해해보자
문자열 "aab", "a0b", "abc"
가 정규식 a.b
와 어떻게 매치되는지 살펴보자.
헷갈릴 수 있는 예시를 보자.
정규식 a[.]b
의 의미는 다음과 같다.
"a + Dot(.)문자 + b"
따라서 정규식 a[.]b
는 "a.b"
문자열과 매치되고, "a0b"
문자열과는 매치되지 않는다.
다음 정규식을 보자.
ca*t
이 정규식에는 반복을 의미하는 *
메타 문자가 사용되었다. 여기에서 사용한 *
은 *
바로 앞에 있는 문자 a가 0부터 2억개로 반복될 수 있다는 의미이다.
정규식 | 문자열 | Match여부 | 설명 |
---|---|---|---|
ca*t | ct | YES | "a"가 0번 반복되어 매치 |
ca*t | cat | YES | "a"가 0번 이상 반복되어 매치 (1번 반복) |
ca*t | caaat | YES | "a"가 0번 이상 반복되어 매치 (3번 반복) |
+
가 있다. +
는 최소 1번 이상 반복될 때 사용한다. 즉 *
가 반복 횟수 0부터라면 +
는 반복 횟수 1부터인 것이다.다음 정규식을 보자.
ca*t
위 정규식의 의미는 다음과 같다.
"c + a(1번 이상 반복) + t"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | Match여부 | 설명 |
---|---|---|---|
ca+t | ct | No | "a"가 0번 반복되어 매치되지 않음 |
ca+t | cat | YES | "a"가 0번 이상 반복되어 매치 (1번 반복) |
ca+t | caaat | YES | "a"가 1번 이상 반복되어 매치 (3번 반복) |
{ } 메타 문자를 사용하면 반복 횟수를 고정할 수 있다. {m, n} 정규식을 사용하면 반복 횟수가 m부터 n까지 매치할 수 있다. 또한 m 또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3 이하를 의미한다. 생략된 m은 0과 동일하며, 생략된 n은 무한대(2억 개 미만)의 의미를 갖는다.
※ {1,}은 +와 동일하고, {0,}은 *와 동일하다.
{ }을 사용한 몇 가지 정규식을 살펴보자.
ca{2}t
위 정규식의 의미는 다음과 같다.
"c + a(반드시 2번 반복) + t"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | Match여부 | 설명 |
---|---|---|---|
ca{2}t | cat | No | "a"가 1번만 반복되어 매치되지 않음 |
ca{2}t | caat | YES | "a"가 2번 반복되어 매치 |
ca{2,5}t
위 정규식의 의미는 다음과 같다.
"c + a(2~5회 반복) + t"
위 정규식에 대한 매치여부는 다음과 같다.
정규식 | 문자열 | Match여부 | 설명 |
---|---|---|---|
ca{2,5}t | cat | No | "a"가 1번 반복되어 매치되지 않음 |
ca{2,5}t | caat | YES | "a"가 2번 반복되어 매치 |
ca{2,5}t | caaaaat | YES | "a"가 5번 반복되어 매치 |
다음 정규식을 보자.
ab?c
위 정규식의 의미는 다음과 같다.
"a + b(있어도 되고 없어도 된다) + c"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식 | 문자열 | Match여부 | 설명 |
---|---|---|---|
ab?c | abc | Yes | "b" 가 1번 '사용'되어 매치 |
ab?c | abc | Yes | "b"가 0번 '사용'되어 매치 |