‘둥근 괄호를 쓰면 그 괄호 안의 내용이 그룹화된다’라고 지난번에 말씀드렸습니다. 이는 예제를 보셔야 이해가 되실 것 같습니다.
사장님사장님 우리 사장님
위의 문자열에서 사장님이 2번 반복된 곳이 있습니다. 이것을 찾아내려면 어떻게 해야 할까요? 쉽다고요? 아래처럼요?
사장님{2}
이 정규식대로 하면 사장님이 2번 반복된 곳을 찾을까요? 오, 노! 아닙니다. 위의 정규식을 해석해 보면 ‘사장 다음에 님이 2번 반복되는 문자열’입니다. 즉 ‘사장님님’을 찾습니다. 따라서 매치가 실패로 돌아갑니다. 사실 이는 지금까지 꼼꼼하게 공부해 오신 분이라면 너무도 당연하게 생각하실 얘기입니다. * + {} 등의 메타문자는 모두 그 바로 앞의 한 글자에 대해서만 적용된다고 여러번 말씀드렸거든요.
그런데도 굳이 이처럼 함정 비스무리한 문제를 드린 것은 괄호의 쓰임새 때문입니다. 위의 문제를 올바로 풀려면 다음과 같이 해야 합니다.
(사장님){2}
이렇게 하면 ‘사장님’이라는 문자열이 그룹화되면서 그 다음 메타문자에게 ‘난 한 덩어리야’라고 가르쳐 주게 됩니다. 한번 더 해보겠습니다. 정규식은 연습, 또 연습이니까요.
1910 2010 1823 2011 1784
위의 연도들에서 1900년 이상의 것들만 매치시키려면 어떻게 해야 할까요?
19|20\d{2}
이렇게 정규식을 작성하셨다면 앞서의 실수를 그대로 반복하신 것입니다. 위의 정규식은 이런 의미입니다. ‘19’이거나 ‘20 다음에 숫자 두 자리’. 이는 의도하는 바가 아닙니다. 올바른 정규식은
(19|20)\d{2}
위와 같습니다. 이제 위 정규식의 의미는 ‘19나 20이 오고 그 다음에 두 자리 숫자’가 됩니다.
둥근 괄호를 써서 이렇게 그룹을 지어 놓으면 여러 가지로 쓸모를 갖게 됩니다. 그 대표적인 것이 참조입니다. 이 참조라는 개념이 사실 좀 어렵습니다. 한번에 이해하시는 건 아마 잘 안 될 것입니다. 앞으로 진행될 강좌의 전방 탐색, 역참조 등을 공부하시면서 몸으로 익히시는 게 좀더 쉬울 것 같습니다.
아무튼 개념은 설명 드려야지요? 지금까지는 단순히 문자열을 매치시키는 방법에 대해서만 논해 왔습니다. 즉 일단 매치가 되고 나면 그것으로 끝이었습니다. 하지만 정규식의 진면목은 바로 참조에 있습니다. 참조란 매치가 된 문자열을 무언가에 다시 써먹는다는 뜻입니다. 그 무언가는 여러 가지가 될 수 있습니다. 일단 치환입니다. 치환을 하려면 검색한 결과를 기억하고 있어야 하니 당연히 참조가 필요합니다.
그러나 검색만 하는 경우라도 참조는 필요합니다. 이는 특정 조건 때문입니다. 즉 무조건 찾는 게 아니라 특정 조건에 맞을 때만 맞는 경우입니다.
에구, 자세한 설명은 아무래도 좀 미뤄야 할 것 같네요.