12 minute read


img

정규표현식

정규표현식은 문자열을 처리하는 방법 중 하나로 특정한 조건의 문자를 ‘검색’하거나 ‘치환’하는 과정을 매우 간편하게 처리 할 수 있는 수단입니다.


정규표현식 패턴들

Page 1

닫기

정규표현식은 대소문자를 구분합니다. 따라서 Case1의 정규표현식은 특정한 문자를 찾아내지만, Case2는 그렇지 못합니다.

Source : Hello world!

Case1

Regular Expression Hello
First match Hello, world!
All match Hello, world!

Case2

Regular Expression hello
First match Hello, world
All match Hello, world

Page 2

정규표현식은 공백을 구별합니다. 따라서 Case1의 정규표현식은 특정한 문자를 찾아내지만, Case2는 그렇지 못합니다.

Source : Hello, world!

Case1

Regular Expression Hello, world
First match Hello, world!
All match Hello, world!

Case2

Regular Expression Hello, world
First match Hello, world
All match Hello, world

정규표현식 패턴들

Page 3

특정한 기호는 특정한 의미를 갖습니다. 소스가 who is who일때, who로 시작하는 소스를 검출할때 ^who를 사용합니다.

who$는 who로 끝나는 텍스트를 검출합니다.

Source : who is who

Case1

Regular Expression ^who
First match who is who
All match who is who

Case2

Regular Expression who$
First match who is who
All match who is who

Page 4

^와 $를 통해 문자를 검출하는 패턴을 Page3에서 알아봤는데, Page4에서는 만약 소스에 $와 ^가 포함되있을 때 어떻게 검출할수있을지를 알아봅시다.

Source : $12$\-\ $25$

Case1

Regular Expression ^$
First match $12$\-\ $25$
All match $12$\-\ $25$

$로 시작하는 텍스트를 검출하고싶지만, Page3에서 알아봤듯이, $ 또한, 특정한 기호이기 때문에 검출되지않습니다.

Case2

Regular Expression $
First match $12$\-\ $25$
All match $12$\-\ $25$

\ 는 \뒤의 기호가 정규표현식에서의 기호가 아닌 단순한 문자를 나타냅니다. 따라서 $에서 $는 단순한 문자 $입니다.

Case3

Regular Expression ^$
First match $12$ -\ $25$
All match $12$ -\ $25$

따라서 ^\$는 $로 시작하는 텍스트만을 검출합니다.

위에서 본 \가 하는 특정한 역할을 해제시키는 역할을 escape라고 합니다.

Case4

Regular Expression $$
First match $12$ -\ $25$
All match $12$ -\ $25$

마찬가지로 \$$는 \$를 통해 표현된 문자 $를 마지막으로 갖는 텍스트를 검출합니다.

Page 11

Quantifier에 대해 알아봅시다. Quantifier를 우리말로 하면 수량자라는 뜻입니다.

수량자는 어떠한 패턴이 얼마나 등장하는 가, 숫자를 나타냅니다.

수량자는 크게 *, +, ? 로 세가지가 있습니다.

* : 0개~여러개

+ : 1개~여러개

? : 0개~1개

Source : aabc abc bc

Case1

Regular Expression a*b
First match aabc abc bc
All match aabc abc bc

a*b 는 b 앞의 a가 0개~여러개를 검출합니다. 따라서 a가 2개인 aab , a가 1개인 ab, a가 0개인 b 모두 검출됩니다.

Case2

Regular Expression a+b
First match aabc abc bc
All match aabc abc bc

a+b 는 b 앞의 a가 1개~여러개를 검출합니다. 따라서 a가 2개인 aab , a가 1개인 ab가 검출됩니다. bc는 a가 없으니 검출되지않습니다.

Case3

Regular Expression a?b
First match aabc abc bc
All match aabc abc bc

a?b 는 b 앞의 a가 0개~1개를 검출합니다. 따라서 a가 1개인 ab, a가 0개인 b가 검출됩니다. aabc는 a가 두개이므로 앞에 있는 a를 제외하고 ab가 검출됩니다.

Page 12

12 페이지에선, *와 함께 기호를 쓰는 특수한 경우를 예시를 통해 알아봅시다.

Source : -@- ** – “*” – ** -@-

Case1

Regular Expression .*
First match -@- ** – “*” – ** -@-
All match -@- ** – “*” – ** -@-

*은 * 앞의 문자를 0개~여러개를 함께 검출하고, .은 모든 특성을 포함하기때문에 .*은 모두 검출합니다.

Case2

Regular Expression -A*-
First match -@- ** – “*” – ** -@-
All match -@- ** – “*” – ** -@-

-A*-는 -와 - 사이에 A가 0개~여러개가 포함되는 것을 검출합니다. 따라서 –는 -와 -사이에 A가 0개이므로 검출되고

-@-는 -와 -사이에 A가 아닌 @가 포함돼기에 검출되지않습니다.

Case3

Regular Expression [-@]*
First match -@- ** – “*” – ** -@-
All match -@- ** – “*” – ** -@-

[-@]*는 대괄호 안의 -와 @가 둘 중 하나가 있는 것을 검출하고, [-@]*은 [-@]가 하나의 문자로 [-@]가 0개~여러개를 검출합니다.

따라서 위와 같이 검출합니다.

Page 13

13 페이지에선, +와 함께 기호를 쓰는 특수한 경우를 예시를 통해 알아봅시다.

Source : -@@@- * ** - - “*” – * ** -@@@-

Case1

Regular Expression *+
First match -@@@- * ** - - “*” – * ** -@@@-
All match -@@@- * ** - - “*” – * ** -@@@-

*+ 는 \를 통해 문자 *를 검출하고, +를 통해 문자 *를 1개~여러개 검출합니다

Case2

Regular Expression -@+-
First match -@@@- * ** - - “*” – * ** -@@@-
All match -@@@- * ** - - “*” – * ** -@@@-

-@+- 는 -와 -사이에 @가 1개 이상을 검출합니다. 따라서 -@@@-를 검출합니다.

Case3

Regular Expression [^ ]+
First match -@@@- * ** - - “*” – * ** -@@@-
All match -@@@- * ** - - “*” – * ** -@@@-

[^ ]+ 에서 [^ ]는 ^가 공백을 부정하므로 공백이 아닌 텍스트 전부를 검출합니다.

Page 14

14 페이지에선, ?와 함께 기호를 쓰는 특수한 경우를 예시를 통해 알아봅시다.

Source : –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

Case1

Regular Expression -X?XX?X
First match –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
All match –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

-X?XX?X 는 - 뒤에 XX를 포함하고 XX 앞, 뒤로 X가 0개 또는 1개를 검출합니다.

검출할 수 있는 텍스트로는 -XX,-XXX,-XXXX가 있습니다.

따라서 -XX는 XX만 포함하고 앞 뒤로 X가 0개이므로 검출합니다.

Case2

Regular Expression -@?@?@?-
First match –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
All match –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

-@?@?@?- 는 -와 - 사이에 @가 0개 또는 1개를 검출합니다. 같은 패턴이 3개있으므로,

따라서 검출할 수 있는 텍스트로는 –, -@-, -@@-, -@@@- 가 있습니다.

Case3

Regular Expression [^@]@?@
First match –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-
All match –XX-@-XX-@@-XX-@@@-XX-@@@@-XX-@@-@@-

[^@]@?@는 [^@]는 @가 아닌 것이고, @?는 @ 0개 또는 1개를 검출합니다.

-@는 -가 @ 아닌 것이고, @?가 0개를 나타내고, 뒤 @가 붙은 것이기때문에 검출합니다.

Page 15

15 페이지에선, 수량을 정확하게 설정하는 수량자를 알아봅시다.

정확한 수량을 설정하는 수량자는 기호 { }를 사용합니다.

예시를 통해 알아봅시다.

Source : One ring to bring them all and in the darkness bind them

Case1

Regular Expression .{5}
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

.{5}는 5개의 문자를 검출합니다. 따라서 First match에서 One r 을 검출하고One r/ing t/o bri/ng th/em al/l and/ in t/he da/rknes/s bin/d the///m이므로 마지막 m을 제외하고 검출합니다.

Case2

Regular Expression [els]{1,3}
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

[els]{1,3}은 e,l,s을 검출하돼 길이가 1이상 3이하를 검출합니다.

Case3

Regular Expression [a-z]{3,}
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

[a-z]{3,}는 소문자로 시작하는 것 중 길이가 3이상인 것을 검출합니다.

따라서 One 은 대문자로 시작하기 때문에, to와 in은 길이가 2이기때문에 검출하지않습니다.

Page 16

16 페이지에선 앞서 배운 *, +, ? 을 중괄호로 표현해봅시다.

+는 0이상이기때문에, {0,}와 같습니다.

*는 1이상이기때문에, {1,}와 같습니다.

?는 0또는 1이기때문에, {0,1}와 같습니다.

Page 17

17 페이지에선 수량자 뒤에 ?가 들어갔을때를 알아봅시다.

예시를 통해 알아봅시다.

Source : One ring to bring them all and in the darkness bind them

Case1

Regular Expression r.*
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

r.*는 앞서봤던 것 처럼 r뒤에 모든 속성과 상관없이( . ) 길이가 0이상인 것을 검출합니다. 따라서 r로 시작해 문장 끝에서 끝납니다.

Case2

Regular Expression r.*?
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

그러나 *뒤에 ?가 붙으면 이는 0을 나타냅니다. 따라서 r만을 검출합니다.

Case3

Regular Expression r.+
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

r.+ 는 r뒤에 모든 속성인 길이가 1이상을 검출합니다. 따라서 r부터 문장끝까지 검출합니다.

Case4

Regular Expression r.+?
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

그러나 +뒤에 ?가 붙으면 이는 1을 나타냅니다. 따라서 r뒤에 문자 하나만을 붙여 검출합니다.

Case5

Regular Expression r.?
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

r.?는 r은 r뒤에 모든 속성인 길이가 0또는 1일 검출합니다. 따라서 ri, rk를 검출합니다.

Case6

Regular Expression r.??
First match One ring to bring them all and in the darkness bind them
All match One ring to bring them all and in the darkness bind them

그러나 ?뒤에 ?가 있으면 이는 0을 나타냅니다. 따라서 r만을 검출합니다.

수량자 뒤에 ?가 붙으면 이는 공통적으로 원래 수량자가 택할 수 있는 수량 중 최소를 택합니다.


이처럼 하는 이유를 알아봅시다.

img

위처럼 div를 택할때 .+의 기호를 택한다면 <div>와 </div>안의 하나 이상을 택하는 것인데,

text

를 택하는 것이 아닌, text의 <div>와 text2의 </div>를 택하여 통으로 검출합니다.

이를 탐욕적인 수량자(Greedy Quantifier)라고 합니다.

img

이를 앞의 <div>text</div>만을 택하여 검출을 하기위해선,

앞서 했던것처럼 .+?를 한다면 하나씩 체크할 수 있습니다.

이를 게으른 수량자(Lazy Quantifier)라고 합니다.

Page 18

18 페이지에선 \w 에 대해 알아봅시다. w는 word, 즉 단어의 줄임말입니다. 모든 문자와 _을 검출합니다.

따라서 \w 는 [A-z0-9_]와 정확히 일치합니다.

Source : A1 B2 c3 d_4 e:5 ffGG77–__–

Case1

Regular Expression \w
First match A1 B2 c3 d_4 e:5 ffGG77–__–
All match A1 B2 c3 d_4 e:5 ffGG77–__–

공백과 _을 제외한 기호는 word에 제외되기 때문에 검출되지않습니다.

Case2

Regular Expression \w*
First match A1 B2 c3 d_4 e:5 ffGG77–__–
All match A1 B2 c3 d_4 e:5 ffGG77–__–

*은 0개 이상을 검출하기 때문에 First match 에서 A1을 검출합니다.

Case2

Regular Expression [a-z]\w*
First match A1 B2 c3 d_4 e:5 ffGG77–__–
All match A1 B2 c3 d_4 e:5 ffGG77–__–

[a-z]\w*은 소문자로 시작하며, 그 뒤 word를 검출합니다. 따라서 대문자로 시작하는 A1, B2는 검출되지않고,

ffGG77은 소문자로 시작하기때문에 대문자가 뒤에 있어도 검출됩니다.

Case3

Regular Expression \w{5}
First match A1 B2 c3 d_4 e:5 ffGG77–__–
All match A1 B2 c3 d_4 e:5 ffGG77–__–

\w 는 word이며 길이가 5인 것을 검출합니다. 따라서 길이가 5가 되지않는 A1 B2 c3 d_4 e:5 는 검출되지않습니다.

Page 19

19 페이지에선 \W 에 대해 알아봅시다. \W는 \w 와 정확히 반대입니다.

따라서 \W 는 [^A-z0-9_]와 정확히 일치합니다.

Source : AS _34:AS11.23 @#$ %12^*

Case1

Regular Expression \W
First match AS _34:AS11.23 @#$ %12^*
All match AS _34:AS11.23 @#$ %12^*

\W는 공백과 _을 제외한 기호를 검출합니다.

Page 20

20페이지에선 \s와 \S에 대해 알아봅시다. \s 는 공백을 검출합니다. \S는 공백을 제외하고 검출합니다.

Source : Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case1

Regular Expression \s
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case2

Regular Expression \S
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Page 21

21페이지에선 \d와 \D에 대해 알아봅시다. d는 digit의 줄임말입니다.

\d는 [0-9]와 일치합니다. \D는 \d를 제외하고 검출합니다.

Source : Page 123; published: 1234 id=12#24@112

Case1

Regular Expression \d
First match Page 123; published: 1234 id=12#24@112
All match Page 123; published: 1234 id=12#24@112

Case1

Regular Expression \D
First match Page 123; published: 1234 id=12#24@112
All match Page 123; published: 1234 id=12#24@112

Page 22

22페이지에선 \b에 대해 알아봅시다. b는 word boundary의 줄임말입니다.

\b.는 어절단위로 앞부분을, .\b는 어절단위의 뒷부분을 검출합니다.

Source : Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case1

Regular Expression \b.
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case2

Regular Expression .\b
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case3

Regular Expression \bcat
First match cat concat
All match cat concat

Case4

Regular Expression cat\b
First match cat concat
All match cat concat

Page 23

23 페이지에선 \B에 대해 알아봅시다. \B는 \b의 반대를 의미합니다.

Source : Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case1

Regular Expression \B.
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case2

Regular Expression .\B
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Page 24

24페이지에선 \A와 \Z에 대해 알아봅시다. \A는 문장의 앞을, \Z는 문장의 뒤를 검출한다는 점에서,

\A는 ^와 유사하고, \Z는 $와 유사합니다.

Source : Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case1

Regular Expression \A…
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

Case2

Regular Expression …\Z
First match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.
All match Ere iron was found or tree was hewn, When young was mountain under moon; Ere ring was made, or wrought was woe, It walked the forests long ago.

그럼 이제 \A와 ^, \Z와 $의 차이점에 대해 알아봅시다.

img

\AEre는 miltiline을 적용하여도 전체의 가장 앞부분의 Ere를 검출합니다.

img

그러나 ^Ere는 첫번째 문장 뿐만아니라 세번째 문장또한 검출합니다.

img

마찬가지로 \Z는 마지막 test만을 검출합니다.

img

test$ 또한 마찬가지로 문장 끝 test를 모두 검출합니다.

Page 25

25 페이지는 예제를 통해 자세히 알아봅시다.

Source : AAAX—aaax—111

Case1

Regular Expression \w+
First match AAAX—aaax—111
All match AAAX—aaax—111

\w는 문자를 뜻하고 +는 0이상을 검출하기 때문에 \w+는 위와 같이 검출합니다.

Case2

Regular Expression \w+(?=X)
First match AAAX—aaax—111
All match AAAX—aaax—111

**여기서 (?=)의 형식은, 이 나올때 까지를 검출합니다. 하지만 은 검출에 포함되지않습니다.**

AAAX—aaax—111 에서 X까지 검출하고 X는 검출되지않는 것을 볼수있습니다.

Case3

Regular Expression \w+(?=\w)
First match AAAX—aaax—111
All match AAAX—aaax—111

마찬가지로 \w+(?=\w)는 \w 까지 검출하는 것이고, \w는 모든 문자를 뜻하기때문에 각각 마지막 문자를 제외하고 검출합니다.

img

추가적으로 위와같은 상황에서, AAAX에서 AAA를 검출하고, 뒤에 aaaX에서 aaa 또한 검출합니다.


Reference