끝나지 않는 프로그래밍 일기


1. 수량자(Quantifier)


오늘 배우게 될 수량자는 아래와 같습니다. (참고로 앞에서 배웠던 메타 문자 +, *, ?도 수량자에 속함)


수량자

설명

{n}

정확히 n개만을 찾습니다.

{n,}

n개 이상을 찾습니다.

{n,m}

최소 n개, 최대 m개의 경우를 찾습니다.

(n 혹은 m은 정수이고 음수가 올 수 없습니다.)


위의 수량자들을 차례대로 알아보도록 합시다. 우선 첫번째 수량자인 {n} 입니다. 이 수량자가 뒤에 따라오면, 앞에 있는 문자 집합 혹은 문자가 n번 연속해서 일치하는지 확인합니다. 주의하셔야 할 부분은, 이상도 아니고 이하도 아닌 정확히 n개만을 찾는다는 겁니다. 예를 들어서, [0-9]{3}는 숫자가 세자리로 연속되어야 일치한다는 것입니다. 만약 두자리라던가, 네자리라면 일치하지 않겠죠. 설명보단 예제를 보는게 더 빠를듯하니 아래 예제를 한번 같이 살펴봅시다.


Reg. Expression:

[0-9]{3}

Text:

12

123

1234

456

4567

45678


Text에서 일치된 내용을 살펴보시면, 세자리로 연속된 숫자만 일치한다는 것입니다. 두자리라던가, 네자리는 일치되지 않음을 확인하실 수 있습니다. 이번에는, 두번째 수량자인 {n,}를 살펴보도록 합시다. 이 두번째 수량자는 첫번째 수량자와는 달리, 최소 n개 이상을 찾습니다. 예를 들어서, [0-9]{3,}인 경우에는, 1과 12는 일치하지 않으며, 123, 1234, 12345.. 같은 경우는 일치합니다. 아래 예제를 한번 보도록 합시다.


Reg. Expression:

\d{3,}\.\d+

Text:

123.456

12.3456

1.23456

1234.56

12345.6


위의 정규 표현식을 살펴보면, 연속된 숫자가 최소 3자리 이상, 그 다음에 .이 위치해야 하며 . 뒤에 연속된 숫자가 존재해야만 일치한다는 것을 알 수 있습니다. Text에 일치한 부분을 살펴보면, . 앞에 세자리 이상인 숫자들만 일치함을 확인하실 수 있습니다. 마지막으로 세번째 수량자입니다. {n,m}은 최소 n개, 최대 m개인 경우를 찾습니다. 예를 들어서, [0-9]{2,4}라면 1과 12345 등은 일치하지 않으며, 12와 123, 1234 같은 경우는 일치합니다. 위에서 말했듯, 최소 n개 이상, 최대 m개 이하인 경우만 찾습니다.


Reg. Expression:

\d{2,4}

Text:

1

12

123

1234

12345


위에서 일치된 녀석들을 살펴보면, 두자리 혹은 세자리 혹은 네자리인 숫자들만 찾고 있습니다. 그 외의 숫자들은 일치하지 않음을 확인하실 수 있습니다. 이번에는 탐욕적 수량자와 게으른 수량자를 알아보도록 합시다.


2. 탐욕적 수량자와 게으른 수량자


우리가 알고있는 +와 * 그리고 {n,}은 탐욕적 수량자에 속합니다. 그렇다면, 탐욕적 수량자는 무엇이고, 게으른 수량자는 무엇일까요? 우선 탐욕적 수량자라고 불리우는 이유는, 가능하면 가장 큰 덩어리를 찾으려 하기 때문입니다. 반면에 게으른 수량자는 가능한 가장 적은, 최소의 덩어리를 찾으려고 합니다. +, *, {n,}은 탐욕적 수량자지만, 뒤에 ? 문자를 덧붙이면 게으른 수량자(+?, *?, {n,}?)가 됩니다.


탐욕적 수량자

게으른 수량자

+

+?

*

*?

{n,}

{n,}?

 

더 확실한 이해를 위해, 탐욕적 수량자와 게으른 수량자의 결과를 비교해보도록 합시다. 아래는 탐욕적 수량자의 경우입니다.


Reg. Expression(Greedy quantifier):

<b>.*</b>

Text:

<b>BOLD!</b><hr><b>BOLD!</b>


위의 정규 표현식은, <b>와 마지막의 </b> 사이에 연속된 문자들을 찾습니다. Text에 일치된 내용을 보시게 되면, <b>와 가장 마지막의 </b> 사이에 있는 연속된 문자를 찾으려 하기 때문에 전체가 일치하는 것입니다. 그럼 이번에는, 게으른 수량자를 보도록 합시다.


Reg. Expression(Lazy quantifier):

<b>.*?</b>

Text:

<b>BOLD!</b><hr><b>BOLD!</b>


일치된 내용을 보니, 탐욕적 수량자와는 달리 최소의 문자 덩어리만 일치합니다. <b> 뒤에 연속된 문자들이 등장하다 처음으로 </b> 태그를 만날때까지 일치시키는 겁니다. 탐욕적 수량자와, 게으른 수량자. 차이점을 잘 알아두시면 나중에 유용하게 쓰일 수 있습니다.


이번 수량자에 대한 설명은 여기서 그만 마치도록 하겠습니다. 다음 강좌에서는 하위 표현식에 관해 설명을 하도록 하겠습니다. 수고하셨습니다.