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


1. 문자 집합(character set)


이번에는 어떤 문자든 통하는 . 문자와는 달리, 대괄호([])를 사용하여 문자 집합을 표현해보도록 할 것입니다. 문자 집합의 예를 한번 살펴보고, 문자 집합이 어떤 것인지 한번 생각해봅시다.


Reg. Expression:

f[ie]

Text:

fire
siren
female
finally
apple
airport


위에 쓰인 정규 표현식을 보자면 대괄호로 둘러싸인 i와 e를 한번 보도록 합시다. 여기서 i와 e를 같이 생각하시면 안됩니다. "f 다음에 i 혹은 e라는 문자가 등장하는 경우에" 일치합니다. 즉, 문자 집합 중 하나가 일치해야 하는거죠. 이번에는, 문자 집합의 범위를 사용하여 검색을 해보도록 해봅시다.


Reg. Expression:

...[0123456789]

Text:

abcd.txt
abce.txt
abc0.txt
abcf.txt
abc1.txt
abc2.txt
abc3.txt


매치된 문자열을 살펴보시면, 아무 문자 3개 뒤에 숫자가 등장해야만 매치가 되는 것을 확인하실 수 있습니다. 문자 집합 [0123456789]은 문자에서 저 집합 가운데에 하나라도 속해야만 매치가 되는 것입니다. 그런데, 정규 표현식에서는 이렇게 범위를 지정하는 것을 편리하게 지정하기 위하여 하이픈(-) 이라는 녀석을 제공합니다. 이 녀석을 통해 패턴의 범위를 지정할 수가 있습니다. 예를 들어, [0-9]는 [0123456789]와 같습니다.


Reg. Expression:

...[0-9]

Text:

abcd.txt
abce.txt
abc0.txt
abcf.txt
abc1.txt
abc2.txt
abc3.txt


아까와 결과가 동일하죠? 숫자뿐만 아니라 숫자가 아닌 문자에서도 하이픈을 사용할 수 있습니다. [a-z]나 [A-Z] 같이 말입니다. (영어가 아니더라도 아스키 문자라면 아무것이나 들어갈 수 있음, 범위 지정시 앞에서는 작은 값이 나와야만 함) 예를 들어서, [a-z]는 [abcdefghijklmnopqrstuvwxyz]를 의미합니다. 그리고, 문자 범위 여러개를 문자 집합 하나에 집어넣을 수도 있습니다. [a-zA-Z0-9]와 같이 말입니다. -> [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]


그럼, 이번에는 어느 문자들을 제외하고 문자열을 검색할 수 있을까요? 물론 가능합니다. 정규 표현식에서는 캐럿(^)이라는 특수한 녀석을 제공합니다. 캐럿 문자를 통해 문자 집합을 지정할 수 있습니다.


Reg. Expression:

...[^0-9]\.

Text:

abcd.txt
abce.txt
abc0.txt
abcf.txt
abc1.txt
abc2.txt
abc3.txt


이번에는 아무 문자 3개의 뒤에 0-9가 등장한 경우를 제외한 나머지가 모두 검색이 되었습니다. 여기서 캐럿이 들어간 문자 집합에 들어간 범위들은 모조리 제외됨을 알아두시길 바랍니다. 다음에는 이스케이프(escape)에 대해 알아보도록 하겠습니다. 수고하셨습니다.