제목만 보고서는 ‘뭔 소리여?’ 하실 것 같습니다. 역시 백문이 불여일견, 백견이 불여일타죠? 직접 쳐보겠습니다.
echo
위 텍스트를 대상으로 다음과 같은 정규식을 적용하면 어떤 결과가 나올까요?
[e].+[h]
이제 이런 정도는 너무 쉽나요? e 다음에 아무 글자나 한 글자 이상이 오고 그 다음에 h가 오면 되니 ech가 매치되겠지요.
그런데 문자열이 다음과 같으면요?
echo echo echo
이렇게 찾아야 할까요? echo echo echo. 즉 ech라는 문자열 3개를 찾는 게 맞을까요? 가령 울트라 에디트에서 찾는다면 처음 찾을 때 맨 앞의 echo echo echo를 찾고 이어서 다음 찾기를 하면 echo echo echo, 또 다음 찾기를 하면 echo echo echo 하는 식으로 찾을까요?
아니면 앞에서부터 끝까지 죽 붙여서 echo echo echo처럼 찾는 게 맞을까요? 이것도 위의 정규식과는 일치하거든요. e로 시작해서 아무 글자나 한 글자 이상 계속되다가 h로 끝나기만 하면 되니까요.
이 경우 후자처럼 찾게 됩니다. 이는 최대 매치에 해당합니다. 그리고 이게 디폴트입니다. 왜냐구요? 그거야 엿장수 맘이죠. 즉, 정규식을 설계한 사람이 이렇게 해놨거든요. 대개는 사람들이 이렇게 찾을 것이라고 본 것이지요.
최대 매치를 다른 말로 탐욕적(또는 탐욕스러운, greedy) 매치라고도 합니다. 실은 이게 정식 용어입니다. 문제는 전자처럼 찾고자 할 경우입니다. 즉 최소 매치입니다. 이에 대한 정식 용어는 게으른(lazy) 또는 욕심없는(non-greedy) 매치입니다. 이렇게 찾고자 할 때는 해당 메타문자 뒤에 물음표를 붙이면 됩니다.
단독으로 쓰이는 메타문자 물음표와 혼동하시면 안 됩니다. 최소 매치의 물음표는 다른 메타문자, 정확하게는 + * {n,}라는 세 개의 메타문자 뒤에 각각 붙여서 사용합니다. 이들 세 개의 메타문자는 수량자(quantifier)라고도 부릅니다. 글자의 개수에 관한 메타문자이기 때문입니다.
아무튼 위의 문자열에서 각 단어마다 따로 찾으려면, 즉 최소 매치를 적용하려면 다음과 같이 됩니다.
[e].+?[h]