축하드립니다. 난데없이 뭘 축하하느냐고요? 드디어 정규식의 고난이도 단계로 들어섰으니까요. 물론 여기까지 오시는 것도 쉽지는 않으셨을 줄 압니다. 하지만 여기서부터 다룰 내용에 비하면 아무것도 아닙니다. 앞으로 익힐 용어 몇 개를 소개해 드리면 이 하위 표현식을 비롯, 캡처, 전방 탐색과 후방 탐색, 역참조, 조건식 등등입니다. 이들은 거의 프로그래밍 수준입니다.
데이터베이스의 SQL 문법을 좀 공부해 보신 분이라면 서브 쿼리라는 걸 들어보셨을 것입니다. 사실 SQL문법에서 INSERT라든가 UPDATE, DELETE 그리고 기본적인 SELECT문 정도는 별거 없습니다. 공식처럼 몇가지만 외우고 있으면 충분히 쓸 수 있습니다. 하지만 서브 쿼리 단계로 들어서면 슬슬 골에 쥐가 나기 시작합니다. 테이블끼리의 조인이라든가 UNION 그리고 프로그래밍에 해당하는 CASE문 등에 이르면 “SQL이여 안녕!”을 외치고 싶어질 정도가 되지요.
SQL의 서브 쿼리가 정규식의 하위 표현식과 개념적으로 조금 비슷합니다. 물론 아주 조금입니다만. 어쨌든 하위 표현식 안에 다시 하위 표현식이 중첩될 수도 있고 이것을 넘어야만 더 상위 단계로 나아갈 수 있다는 점에서도 그렇습니다.
다행히, 아주 다행히도 SQL보다는 정규식이 그나마 약간 더 쉽답니다. 그러니 조금만 더 힘을 내시길!!!
전후방 탐색, 역참조, 조건식 등을 공부하기 위해서는 먼저 하위 표현식을 알아야 합니다. 그럼 하위 표현식이 뭐냐? 간단합니다. 특정 패턴을 둥근 괄호로 묶은 것입니다. 둥근 괄호에 대해서는 앞서 한번 설명드린 적이 있습니다. 2회 강좌에서입니다. 그때 둥근 괄호의 용법이 두 가지 있다고 하면서 연산의 우선순위에 대한 것만 언급했었는데 나머지 하나가 바로 이 하위 표현식입니다.
사실 둥근 괄호의 쓰임새는 세분하자면 그밖에도 몇 가지가 더 있습니다. 이 참에 둥근 괄호에 대한 모든 것을 짚어보고 넘어가기로 하죠. 우선 둥근 괄호에 싸인 패턴은 한 덩어리로 인식됩니다. 즉, 하나의 그룹이 됩니다. 뭔 소리냐고요? 역시 예제를 봐야죠.
백두 한라 지리 설악 금강 소금강 태백
위의 문자열에서 북한에 있는 산들만 선택한다고 합시다. 이는 백두와 금강입니다. 소금강은 제가 여러분들을 조금 헷갈리게 만들려고 일부러 넣은 것입니다. 물론 실제로 있는 산입니다. 다만 남한에 있죠. 제가 군대에 있을 때 여기서 동계훈련을 한 기억이 나네요. 참고로 저는 공수특전단 장교 출신입니다. 뭐, 그렇다고 군출신은 아니고 ROTC라는... ^_^
다음과 같은 정규식은 어떨까요?
백두|금강
|는 ‘또는(or)’에 해당하는 메타문자입니다. 영어 대문자 I와 비슷하게 생겼지만 키보드의 백스페이스 바로 왼쪽에 있는 키입니다. 시프트를 누르고 찍는... 아무튼 위의 텍스트와 정규식을 지난번에 소개해 드린 파이어폭스의 정규식 테스터에 입력한 뒤 Test 버튼을 누르면 어떤 결과가 나올까요? 백두 금강 소금강 이렇게 3개의 단어들이 선택됩니다. 사실 이는 당연한 결과입니다.
그럼 백두와 금강만 매치시키려면 어떻게 해야 할까요? 이럴 때 쓰라고 있는 것이 12회 강좌에서 설명드린 ‘단어 경계’입니다. 이를 써서 정규식을 다시 작성해 보겠습니다.
\b백두|금강\b
위의 정규식을 쓰면 잘 될 것 같죠? 그런데 막상 결과를 보니 똑같습니다. 왜 그럴까요? 이는 연산의 우선순위 때문입니다. 정규식의 메타문자 가운데 |는 가장 나중에 적용됩니다. 따라서 위의 정규식은 ‘\b백두와 매치가 되거나 금강\b와 매치가 되거나’라는 의미로 해석됩니다. 이런 상황을 벗어나기 위해서는 둥근 괄호를 써야 합니다. 수학이나 프로그래밍에서와 마찬가지로 연산의 우선순위를 바꾸는 거죠. 둥근 괄호는 연산의 우선순위를 가장 높게 만들어줍니다. 아래와 같이 합니다.
\b(백두|금강)\b
위의 정규식은 이제 ‘백두와 매치가 되거나 금강과 매치가 되면서 동시에 앞뒤로 공백문자가 있어서 단어가 되는 문자열’로 해석됩니다. 여기까지는 쉽지요? 프로그래밍 공부를 조금만 해보신 분이라면 금방 이해가 되셨을 것입니다.
둥근 괄호에 대한 얘기는 계속되는데... ㅋ 무슨 드라마 대사 같습니다.