앞서 캐럿(^)의 사용법에 대해 설명드렸습니다. ‘그런 것도 있었나?’ 하시는 분들, 없으시겠지만 혹시 몰라서 리뷰해 드립니다.
정규식에서 캐럿이 일반문자가 아닌, 즉 메타문자로 쓰일 때는 두 가지 의미를 갖습니다. 하나는 특정 문자집합을 제외한다는 것이고 다른 하나는 문자열의 가장 앞이라는 의미입니다. 이중 두 번째 용법이 바로 검색할 위치에 관계된 것입니다. 가령,
abc acc adc aec
^[a].+?[c]
위의 문자열을 대상으로 아래 정규식을 적용하면 맨 앞의 abc만 매치됩니다. 이 정규식에서 캐럿을 빼면 당연히 abc, acc, adc, aec가 모두 매치됩니다. 이처럼 정규식에서는 검색할 위치 지정을 가능케 하는 방법이 몇 가지 있습니다.
“문자열의 처음을 지정하는 방법이 있다면 문자열의 끝을 지정하는 방법도 있지 않겠어?” 와우, 역시 머니북 사용자이십니다. 당연히 있습니다. 달러 표시($) 메타문자가 그것입니다. 예를 보겠습니다.
[a].+?[c]$
위와 똑같은 정규식인데 캐럿이 사라지고 대신 맨 뒤에 달러 표시가 붙었습니다. 이렇게 하면 문자열에서 맨 뒤에 있는 aec만 매치됩니다.
위치 지정에서 빠질 수 없는 것이 있습니다. 바로 단어 경계입니다. 역시 예를 보겠습니다.
america erica pericana
위의 문자열에서 erica를 검색한다고 하면 두 번째 문자열만 매치될까요? 아닙니다. erica가 들어 있는 다른 문자열들도 매치됩니다. 따라서 위의 3개 단어 모두 매치됩니다.
단어 경계라는 것은 이런 경우를 위해 태어났습니다. 여기서 경계는 주로 공백을 의미합니다. 단어와 단어를 구분하는 기준이 주로 공백이니까요. 이 공백은 말 그대로의 공백, 즉 스페이스 바를 쳤을 때 찍히는(눈에는 안 보이죠?) 글자와 탭, 줄바꿈문자 등을 모두 포함합니다. 즉 공백 문자입니다. 따라서 찾고자 하는 단어가 한 줄의 맨 끝에 위치하고 있어도 당연히 매치가 됩니다. \b가 실제의 공백을 가리키는 게 아니라 ‘단어 단위로 찾기 위한 기호’라는 걸 아셔야 합니다. 이러한 사실은 검색 결과를 봐도 알 수 있습니다. 단어의 앞뒤에 있는 공백은 검색 결과에서 빠지거든요.
이 단어 경계를 가리키는 메타문자는 \b입니다. 위의 문자열에서 정확히 erica만 검색하고 싶다면 다음과 같이 해야 합니다.
\berica\b
만약 앞의 \b를 빼면 america도 같이 검색됩니다. 문자열의 뒷 부분만 단어 경계를 지정한 것이니까요. 검색 위치에 관한 것은 양이 좀 많으니까 오늘은 이만 줄입니다.