(\d{2})(-|/)(\d{2})(-|/)(\d{4})
지난 회에서 소개해 드렸던 정규표현식입니다. 정규식이 낯선 분이라면 위의 식을 설명해 드려도 이해하기 어려우시겠지만 진도상 간단하게나마 알아보고 정규 과정을 시작하겠습니다. 이거, 정규라는 단어가 자주 나오네요. ^_^
정규식에서 (), 즉 둥근 괄호 혹은 소괄호를 쓰는 용도는 크게 두 가지입니다. 하나는 수학이나 프로그래밍에서의 용도와 같습니다. 즉 연산의 우선 순위상 먼저 계산해야 할 것들을 괄호로 감싸줍니다.
10 ? 2 * 2
(10 ? 2) * 2
위의 두 식이 각각 다른 결과를 갖는다는 정도는 아시죠? 그래도 혹 모르는 분이 계실까봐 잠깐 설명드리면, 위 식은 연산의 우선 순위상 2 * 2가 먼저 계산된 뒤 10에서 이 4를 빼주므로 결과는 6이 됩니다. 아래 식은 괄호 안에 있는 10 ? 2를 먼저 계산하므로 8 * 2가 되어 결과 값은 16이 됩니다.
두 번째 용도는 패러미터로 쓰기 위함입니다. 각 둥근 괄호는 앞에서부터 1, 2, 3으로 패러미터가 매겨집니다. 이 패러미터를 어디다 쓰느냐? 바로 치환할 때 씁니다. 지난 회의 ‘교체할 대상’에 입력했던 \5-\3\-\1 기억하시죠? 이때 \5는 5번째 패러미터라는 의미입니다. \3은? 당근 세 번째 패러미터입니다.
\d는 숫자입니다. \d당 하나의 숫자를 의미합니다. 그러니까 \d\d는 두 자리 숫자가 되겠네요. 이어 나오는 중괄호 {2}는 2회 반복이라는 뜻입니다. 그러니까 \d{2}라고 쓰면 연속해서 두 번 나오는 숫자를 가리킵니다. 결과적으로 \d\d와 같습니다. 그 다음 둥근 괄호가 또 나오죠? 여기서는 패러미터의 용도가 아니라 연산 우선순위의 용도로 사용되고 있습니다.
| 표시(키보드의 백스페이스 왼쪽에 있는 키입니다. \ 표시와 함께 있는. 그러니까 시프트와 함께 눌러야 찍힙니다)의 왼쪽에는 -(하이픈), 오른쪽에는 /(슬래시) 기호가 있습니다. 이는 정규표현식의 특수 기호가 아니라 찾고자 하는 기호일뿐입니다. 그리고 |은 or(또는)의 의미입니다. 결국 (-|/)은 ‘하이픈이거나 슬래시거나’라는 뜻이 됩니다.
그런데 왜 둥근 괄호로 감쌌을까요? 만약 괄호를 쓰지 않았다면 | 기호를 중심으로 왼쪽 전체이거나 오른쪽 전체이거나가 됩니다. 한번 괄호를 쓰지 않고 표기해 보겠습니다.
(\d{2})-|/(\d{2})(-|/)(\d{4})
이 식은 (\d{2})-라는 정규식과 매치되거나 혹은 /(\d{2})(-|/)(\d{4})라는 정규식과 매치되는 문자열을 찾습니다. 이는 의도하는 바와 전혀 다른, 엉뚱한 얘기가 됩니다.
나머지는 같은 패턴이므로 생략합니다.
에구, 좀 어려웠나 모르겠습니다. 모르겠다니? 당연히 어렵지, 뭘 몰라. 퍽퍽퍽~~ 죄송합니다. T_T 정규표현식을 처음 접해 보시는 분이라면 당연히 어렵겠지요. 정규표현식을 익숙하게 구사하시려면 첫째도 연습, 둘째도 연습입니다. 이 정규표현식이라는 놈은, 눈팅만으로는 도저히 친해질 방법이 없습니다. 공식을 아무리 외우고 책을 몇 번씩 읽었다 해도 연습이 없으면 사상누각입니다. 이는 정규식의 고수들이 이구동성으로 하는 얘기니까 여러분도 ‘미읻씁니다’ 하셔야 합니다.
흔히 정규표현식에는 정답이 없다고들 합니다. 다시 말해 같은 결과를 내는 정규표현식이라도 여러 가지로 작성될 수 있다는 것입니다. 게다가 프로그래밍 언어나 애플리케이션에 따라 문법에서도 상당한 차이를 보이고 있습니다. 잠깐, 호기심 해소 차원에서 위의 정규표현식을 다른 방법으로 작성해 보겠습니다.
([0-9]{2})(-|/)...
앞부분이 좀 다르죠? 이쯤에서 한숨 돌리고 다음에 뵐게요.