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


1. + (문자가 하나 이상 있으면 일치)


지금까지 배운 정규 표현식을 사용하여 이메일 형식을 검색하고자 한다면, 어떤 방식으로 검색을 할 수 있을까요? 여태까지 배운 내용으로는 "a@b.c" 즉, \w@\w\.\w 라고 만들 수 있겠습니다. 그러면, "abc@def.ghi", "abcd@efgh.ijk" 같은 연속된 문자는 어떻게 검색을 할까요? 그것은 바로, 지금 배우게 될 +란 메타 문자로 해결할 수 있습니다.


Reg. Expression:

\w+@\w+\.\w+

Text:

id@gmail.com

id@daumnet

id@naver.com

id@nate.com

id@google


정규 표현식을 차례대로 살펴보도록 합시다. \w는 즉, [a-zA-Z0-9_], 그리고 그 다음 등장하는 메타 문자 +는 문자가 하나 이상일 때 일치시키는 녀석입니다. 하나 이상 일치해야 하기 때문에, 하나도 없으면 일치하지 않겠죠. 예를 들어서, [a-z]+는 한 자리 이상 연속된 소문자를 찾는 것입니다. 그리고 뒤에 등장하는 .는 메타 문자이기에, \로 이스케이프(escape) 해주어야 합니다.


2. * (문자가 없거나, 하나 이상 있으면 일치)


우리가 방금 사용한 메타 문자 +는, 문자가 하나 이상 일치해야만 하는데 문자가 아에 없거나 하나 이상일 경우에는 * 문자를 문자 또는 문자 집합 뒤에 써주시면 됩니다. 예를 들어, "bo+"는 bo, boo를 찾을 수 있지만, b는 찾지 못하고 "bo*"는 b, bo, boo 모두다 찾습니다. 비교를 한번 해봅시다.


Reg. Expression(+):

bo+

Text:

b

bo

boo


Reg. Expression(*):

bo*

Text:

b

bo

boo


이해가 되시나요? 메타 문자 *를 사용한 예제를 하나 더 보도록 합시다.


Reg. Expression:

Player[0-9][0-9]*

Text:

Player1

Player7

Player

Player11

Player14

Player100

Player_

Player@

Player12


Player 뒤에 번호가 붙은 문자열만 검색하고자 한다면, 위와 같이 Player[0-9][0-9]* 처럼 작성할 수 있겠습니다. Player 뒤에는 한자리라도 숫자가 존재해야 하기 때문에 [0-9]를 먼저 쓰고, 숫자가 유효하면 [0-9]*를 통해, 두자리 이상의 숫자도 검색이 가능하게 합니다. 만약 한자리의 숫자라도 메타 문자 *는 없어도 일치시키기 때문에 문제될 것이 없습니다. 만약에 메타 문자 +를 사용하였다면, "Player1"과 "Player7"은 검색이 되지 않았을 것입니다.


3. ? (문자가 없거나, 하나만 있으면 일치)


메타 문자 ?는 메타 문자 *와는 차이가 있습니다. *는 문자가 없거나, 하나 이상이 있으면 일치하지만, ?는 문자가 없거나, 하나만 있어야 일치합니다. 즉, 2개, 3개...는 대상에서 제외된다는 것입니다. 확실한 이해를 위해 아래 예를 한번 보도록 합시다.


Reg. Expression:

aabb?cc

Text:

aabbcc

aabbbcc

aabbcc


위의 정규 표현식은, aab 다음에 b가 없거나, b가 하나만 있는 경우만 일치시킨다는 겁니다. aabbcc는 일치가 되었으나, aabbbcc는 일치가 되지 않았습니다. 여기서 중요한건 "b가 하나만 있는 경우" 입니다. b가 2개 이상인 경우에는 일치되지 않습니다. 위의 정규 표현식에서 ?가 아닌 *를 썼다면, 세개다 일치할 것입니다. 예제를 하나 더 보도록 합시다.


Reg. Expression:

Player[0-9][0-9]?

Text:

Player1

Player7

Player

Player11

Player14

Player100

Player_

Player@

Player12


일치된 내용을 보시면, 한자리거나 두자리의 숫자가 따라붙는 경우에만 일치됨을 알 수 있습니다. 세자리는 일치시키지 못합니다. *와 ?의 차이점을 아시겠나요? 이번 강좌는 여기서 마치도록 하고, 다음 강좌에서는 수량자에 대해서 알아보도록 하겠습니다. 수고하셨습니다.