지난 글에 이어 이어서 정규 표현식을 정리해보았다.
1. 정규 표현식 익히기
1-1. 서브 패턴
정규 표현식에서 소괄호()로 모아진 일부분을 서브패턴이라고 한다. 이 소괄호 안에는 다양한 문자, 문자열들을 입력할 수 있다. (a|bc|de|f|g) 이런식으로 입력할 수 있다. 여기서 |는 or의 의미를 갖는다라고 이해하면 쉽다. a 또는 bc 또는 de 또는 f 또는 g 이 중 하나라도 매치되는 것이 있다면 매칭되게 된다.
사례 1
소스 : Monday Tuesday Friday
정규 표현식 : (on|ues|rida)
첫 번째 매치
Monday Tuesday Friday
전체 매치
Monday Tuesday Friday
on 또는 ues 또는 rida 와 매칭되는 것이 있다면 매칭되게 된다. 셋 중 처음으로 등장하는 on이 매치되게 되고 전체 매치에서는 on, ues, rida 모두 매칭되게 된다.
사례 2
소스 : Monday Tuesday Friday
정규 표현식 : (Mon|Tues|Fri)day
첫 번째 매치
Monday Tuesday Friday
전체 매치
Monday Tuesday Friday
정규 표현식에 따라 Monday 또는 Tuesday 또는 Friday가 매칭되게 된다.
사례 3
소스 : Monday Tuesday Friday
정규 표현식 : ..(id|esd|nd)ay
첫 번째 매치
Monday Tuesday Friday
전체 매치
Monday Tuesday Friday
정규 표현식의 ..은 어떤 문자든 2개의 문자를 나타낸다. 나머지는 iday 또는 esday 또는 nday 중 하나와 매치되면 된다.
전체 매치에서 Mo nday, Tu esday, Fr iday(이해를 위해 2개의 문자와 나머지 부분 사이를 임의로 띄어쓰기했다.) 이렇게 3개 모두 매칭된 것을 보면 이해가 쉬울 것이다.
1-2. 수량자
수량자는 특정 문자나 문자열이 뒤에 붙게되며 그 문자나 문자열이 몇 번이나 등장하게 되는지를 지정한다.
별모양 * 기호는 0회 이상(등장하지 않아도 되고 한 번 이상 등장해도 된다.) 등장하면 매치된다. (0 ~ ∞)
더하기 + 기호는 1회 이상 등장하면 매치된다. (1 ~ ∞)
물음표 ? 기호는 0회 혹은 1회 등장해야 매치된다. (0~1)
사례 1
소스 : aabc abc bc
정규 표현식 : a*b
첫 번째 매치
aabc abc bc
전체 매치
aabc abc bc
a 뒤에 * 기호가 붙었기 때문에 a가 0회 이상 등장하면 매치된다. 수량자는 뒤에 그 기호 하나만 붙었을 때에는 가능한 문자가 많이 포함되게 매치된다. (수량자는 가장 큰 덩어리를 찾으려 한다.) 정규 표현식과 매칭되는 첫번째 문자열 중에서 가장 많은 문자를 포함하는 문자열이 매칭된다. 만약 소스가 bc ab aabc 라면 첫 번째 매칭되는 문자열을 찾으면 맨앞에 b만 매치되었을 것이다.
이 부분은 추후에 나올 탐욕적 수량자와 게으른 수량자 개념을 보게되면 더 잘 이해될 것이다.
사례 2
소스 : aabc abc bc
정규 표현식 : a+b
첫 번째 매치
aabc abc bc
전체 매치
aabc abc bc
a 뒤에 + 기호가 붙었기 때문에 a가 1번 이상 등장해야 매치된다. 따라서 위와 달리 b에는 매치가 되지 않았다.
사례 3
소스 : aabc abc bc
정규 표현식 : a?b
첫 번째 매치
aabc abc bc
전체 매치
aabc abc bc
a 뒤에 ? 기호가 붙었기 때문에 a는 딱 한 번 등장하거나 등장하지 않아야 매치된다.
이해를 위해 * 수량자를 더 살펴보도록 하자.
사례 1
소스 : -@- *** -- "*" -- *** -@-
정규 표현식 : .*
첫 번째 매치
-@- *** -- "*" -- *** -@-
전체 매치
-@- *** -- "*" -- *** -@-
모든 문자 . 에 *를 붙였으니 어떠한 문자든 등장하기만 하면 매치된다. 수량자는 가장 큰 덩어리를 찾기 때문에 이는 문자열 전체를 뜻하게 된다.
사례 2
소스 : -@- *** -- "*" -- *** -@-
정규 표현식 : .-A*-
첫 번째 매치
-@- *** -- "*" -- *** -@-
전체 매치
-@- *** -- "*" -- *** -@-
두 - 사이에 A가 0회 이상 등장하면 매치된다. -A-, -AA-, ... 과 같은 문자열이 없기 때문에 --만 선택된 것을 볼 수 있다.
사례 3
소스 : -@- *** -- "*" -- *** -@-
정규 표현식 : [-@]*
첫 번째 매치
-@- *** -- "*" -- *** -@-
전체 매치
-@- *** -- "*" -- *** -@-
-와 @ 로만 이루어진 덩어리와 매칭되게 된다.
이번에는 + 수량자를 더 살펴보도록 하자.
사례 1
소스 : -@@@- * ** - - "*" -- * ** -@@@-
정규 표현식 : \*+
첫 번째 매치
-@@@- * ** - - "*" -- * ** -@@@-
전체 매치
-@@@- * ** - - "*" -- * ** -@@@-
\*는 *문자 그 자체를 나타낸다. *가 한 번 이상 등장하면 매칭된다.
사례 2
소스 : -@@@- * ** - - "*" -- * ** -@@@-
정규 표현식 : -@+-
첫 번째 매치
-@@@- * ** - - "*" -- * ** -@@@-
전체 매치
-@@@- * ** - - "*" -- * ** -@@@-
두 - 사이에 @가 한 번 이상 등장하면 매치된다.
사례 3
소스 : -@@@- * ** - - "*" -- * ** -@@@-
정규 표현식 : [^ ]+
첫 번째 매치
-@@@- * ** - - "*" -- * ** -@@@-
전체 매치
-@@@- * ** - - "*" -- * ** -@@@-
대괄호 속이 빈 것 같아 보이지만 ^와 공백이 들어있다. 따라서 공백이 아닌 문자가 하나 이상이면 매치되게 된다.
이번에는 ? 수량자를 더 살펴보도록 하자.
사례 1
소스 : --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
정규 표현식 : -X?XX?X
첫 번째 매치
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
전체 매치
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
- / X? / X / X? / X 앞에서 부터 이렇 다섯 부분으로 나누어서 살펴보면 이해가 쉽다. 맨 앞에는 -가 오고, 그 다음에는 X 하나가 올수도 안올수도, 그 다음에는 X가, 그 다음에는 X 하나가 올수도 안 올수도, 그 다음에는 X가 온다.
경우를 따져보면 -XX, -XXX, -XXXX 이렇게 3가지 경우가 있을 것이다. 그에 따라 매칭된 것을 볼 수 있다.
사례 2
소스 : --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
정규 표현식 : -@?@?@?-
첫 번째 매치
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
전체 매치
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
두 - 사이에 @가 하나가 올수도 안올수도 있는데 이것이 3개가 있다.
경우를 따져보면 --, -@-, -@@-, -@@@- 이렇게 4가지 경우가 있을 것이다. 그에 따라 매칭된 것을 볼 수 있다.
사례 3
소스 : --XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
정규 표현식 : [^@]@?@
첫 번째 매치
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
전체 매치
--XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
[^@]은 @이 아닌 문자를 뜻하고, 그 뒤에 @ 하나가 올 수도 안 올수도 있고, 그 다음에는 @가 온다.
[@이 아닌 문자]@, [@이 아닌문자]@@ 이렇게 두 가지 경우가 있다. 그에 따라 매칭된 것을 볼 수 있다.
지금까지 살펴본 수량자들은 정확하게 몇 개를 지정할 수 없는 수량자들이었다. 원하는 수량을 정확하게 지정하려면 {}를 이용하면 된다.
{m}은 정확히 m번 등장한다는 의미이며, {m,n}은 최소 m번, 최대 n번 등장한다는 의미이다.
{m,}과 같이 콤마 이후를 비워두면 최소 m번 등장한다는 의미가 된다.
사례 1
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : .{5}
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
. 뒤에 {5}가 붙었으므로 어떤 문자든 5문자로 이루어진 문자열이 매치된다.
One r ing t o bri ng th em al l and in t he da rknes s bin d them 띄어쓰기에 유의하여 이렇게 5문자씩 나누면 m이 하나 남게되어 전체 매치에서는 m을 제외하고 매치되게 된다.
사례 2
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : [els]{1,3}
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
e,l,s 중 한 문자가 최소 한 번, 최대 세 번 반복되면 매치되게 된다.
사례 3
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : [a-z]{3,}
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
a에서 z까지의 알파벳이 3번 이상 반복되면 매치되게 된다. 대문자 O가 들어간 One과 2문자로 이루어진 in이 매치되지 않은 것을 볼 수 있다.
지금까지 알아본 것을 토대로 잘 생각해 보면 *와 +와 ?는 중괄호로 이루어진 수량자의 특수 케이스와 대응된다는 것을 알 수 있다.
* 는 {0,}와 같고, +는 {1,}와 같고, ?는 {0,1}과 같다.
사례 1
소스 : AA ABA ABBA ABBBA
정규 표현식 : AB*A
첫 번째 매치
AA ABA ABBA ABBBA
전체 매치
AA ABA ABBA ABBBA
두 A 사이에 B가 0번 이상 등장하면 매치된다.
사례 2
소스 : AA ABA ABBA ABBBA
정규 표현식 : AB{0,}A
첫 번째 매치
AA ABA ABBA ABBBA
전체 매치
AA ABA ABBA ABBBA
*와 {0,}은 같기 때문에 위의 결과와 완전히 같다.
사례 3
소스 : AA ABA ABBA ABBBA
정규 표현식 : AB+A
첫 번째 매치
AA ABA ABBA ABBBA
전체 매치
AA ABA ABBA ABBBA
두 A 사이에 B가 1번 이상 등장하면 매치된다.
사례 4
소스 : AA ABA ABBA ABBBA
정규 표현식 : AB{1,}A
첫 번째 매치
AA ABA ABBA ABBBA
전체 매치
AA ABA ABBA ABBBA
+와 {1,}은 같기 때문에 위의 결과와 완전히 같다.
사례 5
소스 : AA ABA ABBA ABBBA
정규 표현식 : AB?A
첫 번째 매치
AA ABA ABBA ABBBA
전체 매치
AA ABA ABBA ABBBA
두 A 사이에 B가 0번 또는 1번 등장하면 매치된다.
사례 6
소스 : AA ABA ABBA ABBBA
정규 표현식 : AB{0,1}A
첫 번째 매치
AA ABA ABBA ABBBA
전체 매치
AA ABA ABBA ABBBA
?와 {0,1}은 같기 때문에 위의 결과와 완전히 같다.
1-3. 탐욕적 수량자와 게으른 수량자
앞서 *, +, ? 모두 최대한 큰 덩어리를 찾으려 한다고 했다. 따라서 이들을 탐욕적 수량자라고 부른다. 수량자 뒤에 ?를 붙이게 되면 이 ?는 앞에 등장하는 수량자를 게으른 수량자로 바꾸어준다. 게으른 수량자는 가장 작은 덩어리를 찾으려 한다. 매칭될 수 있는 가장 작은 덩어리를 찾으면 거기서 매칭이 끝나게 된다. 예시를 살펴보면 이해가 쉽다.
사례 1
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : r.*
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
탐욕적 수량자는 가장 큰 덩어리를 찾으려고 한다. r 뒤에 어떤 문자든 0개 이상 있으면 매치가 된다. 다시 말해 r뒤의 모든 문자가 매칭되게 된다.
사례 2
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : r.*?
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
*뒤에 ?가 붙으면 게으른 수량자가 된다. r 뒤에 어떤 문자든 0개 이상 있으면 된다는 조건에서 가장 작은 덩어리는 그냥 문자 r 하나가 될 것이다. 그에 따라 매칭된 것을 볼 수 있다.
사례 3
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : r.+
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
탐욕적 수량자는 가장 큰 덩어리를 찾으려고 한다. r 뒤에 어떤 문자든 1개 이상 있으면 매치가 되는 가장 큰 덩어리, r 뒤에 이어지는 모든 문자가 매치되게 된다. 1개 이상의 문자는 있어야 하기에 r이 문자열의 맨 마지막에 처음 등장한다면 매치되는 것이 없을 것이다.
사례 4
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : r.*?
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
*뒤에 ?가 붙어 게으른 수량자가 되었다. r 뒤에 어떤 문자든 1개 이상 붙어야한다는 조건하에서 가장 작은 덩어리는 r.이 될것이다. 그에 따라 매칭된 것을 볼 수 있다.
사례 5
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : r.?
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
r뒤에 어떠한 문자든 하나가 있어도 되고 없어도 된다. 탐욕적 수량자는 r뒤에 어떤 문자가 있다면 그 문자까지 선택할 것이다. 그에 따라 매치된 것을 볼 수 있다.
사례 6
소스 : One ring to bring them all and in the darkness bind them
정규 표현식 : r.??
첫 번째 매치
One ring to bring them all and in the darkness bind them
전체 매치
One ring to bring them all and in the darkness bind them
?뒤에 ?가 붙어 게으른 수량자가 되었다. r뒤에 어떤 문자든 하나가 있어도 되고 없어도 되는 상황에서 가장 작은 덩어리를 고르게 된다면 그냥 문자 r 하나만 선택되게 될 것이다.
'기타' 카테고리의 다른 글
동기 / 비동기, 블로킹 / 논블로킹 (0) | 2025.01.09 |
---|---|
정규 표현식 (3) (0) | 2024.12.19 |
정규 표현식 (1) (0) | 2024.12.17 |