정규표현식 024. 숙제와 답

조회 수 4839 추천 수 0 2012.02.17 14:26:37
일단 숙제부터 풀어야죠?

\.[^\\/\n]+$

어떻습니까. 쉽죠? 지난번에 알아본 파일명 추출 정규식과 거의 비슷합니다. 단지 앞에 마침표만 하나 더 붙어 있습니다. 마침표 자체는 정규식의 메타문자이므로 이스케이프 처리했습니다. 아무튼 위의 정규식을 해석해 보면 ‘마침표가 있고 이어 백슬래시나 슬래시, 줄바꿈 기호가 아닌 글자들이 하나 이상 이어지다가 그 글자들로 끝나는 문자열’이 됩니다.

그런데 여기서 돌발 퀴즈. 위의 정규식을 적용하면 마침표를 포함해서 검색합니다. 마침표를 떼어내고 순수한 확장자만 매치시키려면 어떻게 해야 할까요? 오늘 글은 제목이 ‘숙제와 답’이니 바로 가르쳐 드립니다. ^_^

(?<=\.)[^\\/\n]+$

먼저 알아본 정규식에서 마침표 부분을 후방 탐색 처리했습니다. 즉, 마침표를 매치시키기는 하되 검색 결과에 포함시키지는 않는 것입니다. 물론 프로그래밍 언어를 사용하는 경우라면 먼저 알아본 정규식의 검색 결과에다 스트링 함수를 써서 처리할 수도 있습니다. 다음과 같이 말입니다. 일단 \.[^\\/\n]+$ 정규식의 결과로 나온 문자열을 s라고 정합니다.

<비주얼 베이직, ASP>
Mid(s, 2)

Mid 함수에서 3번째 패러미터를 생략하면 문자열의 끝까지 리턴합니다. 그리고 문자열 인덱스를 1부터 시작하므로 2번째 패러미터로 2를 줍니다.

<PHP>
substr(s, 1);

substr 함수도 3번째 패러미터를 생략하면 문자열의 끝까지 리턴합니다. 그러나 문자열 인덱스를 0부터 시작하므로 2번째 패러미터로 1을 줍니다.

<자바스크립트>
자바스크립트를 공부해 보신 분이라면 알겠지만 substr 함수(메써드)와 substring 함수가 늘 헷갈립니다. 필자도 마찬가지입니다. 항상 이 함수들을 쓸 때마다 매뉴얼을 뒤적여야 합니다. 에구, 뭔 놈의 함수를 이렇게 만들었을까. 좌우간 예를 볼까요?

s1 = ‘영일이삼사오륙칠팔구’;
s1.substr(3, 5);
s1.substring(3, 5);

첫 번째 함수 substr의 리턴값은 ‘삼사오륙칠’입니다. 이 함수의 첫 번째 패러미터는 추출될 문자열의 시작 인덱스입니다. 이 예에서는 3이니까 4번째 글자부터 시작합니다. 그리고 두 번째 패러미터는 추출될 문자열의 길이입니다. 그리고 그 기준점은 첫 번째 패러미터입니다. 즉, ‘삼’에서부터 시작해 5글자입니다.

두 번째 함수 substring의 리턴값은 ‘삼사’입니다. 첫 번째 패러미터의 작용은 똑같습니다. 다만 두 번째 패러미터의 시작 위치가 다릅니다. substr 함수는 첫 번째 패러미터가 시작점이었지만 substring은 문자열의 처음 위치가 시작점입니다. 다만 이 경우 인덱스는 0부터 시작하는 게 아니라 1부터 시작합니다. 에궁, 설명하는 저도 자꾸 말이 꼬이네요. 차근차근 다시 정리해 볼까요? 첫 번째 패러미터에 의해 글자 ‘삼’부터 시작합니다. 두 번째 패러미터에 의해 ‘영일이삼사’가 지정됩니다. 그리고 이 문자열 가운데 ‘영일이’는 버리고 ‘삼사’만 취합니다. 첫 번째 패러미터가 ‘삼’부터 시작하라고 했으니까요. 으으윽~ 그래도 어렵나요? 이 이상 더 쉽게 설명할 방법은 없다는...

이제 실전입니다. ASP의 Mid(s, 2)와 같은 결과를 얻으려면 어떻게 해야 할까요? 아래와 같습니다.

s.substring(1, s.length);

저는 사실 자바스크립트의 문자열 추출 함수가 왜 이렇게 복잡할까에 대해 의아했었습니다. 그런데 정규식을 공부하다 보니 이런 함수도 필요하겠구나 싶은 생각이 들었습니다. 위 함수를 보세요. 얼마나 간결합니까. 이를 풀어보면 이렇게 되죠. 두 번째 패러미터에 의해 전체 문자열이 지정됩니다. 그러나 첫 번째 패러미터에 의해 그중 두 번째(인덱스로는 1)부터 글자부터 끝까지 취합니다. 결국 문자열의 맨 앞에 있는 마침표는 제외되는 것입니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
29 정규표현식 029. 자바스크립트의 정규식 5 마라톤맨 2012-03-28 8710
28 정규표현식 028. 자바스크립트의 정규식 4 마라톤맨 2012-03-09 4547
27 정규표현식 027. 자바스크립트의 정규식 3 마라톤맨 2012-03-02 4675
26 정규표현식 026. 자바스크립트의 정규식 2 마라톤맨 2012-02-27 5315
25 정규표현식 025. 자바스크립트의 정규식 1 마라톤맨 2012-02-22 6503
» 정규표현식 024. 숙제와 답 마라톤맨 2012-02-17 4839
23 정규표현식 023. 정규식의 옵션과 여러 정규식 엔진들 마라톤맨 2012-02-15 15890
22 정규표현식 022. 드라이브명과 디렉토리, 파일명 분리 2 마라톤맨 2012-02-13 9820
21 정규표현식 021. 드라이브명과 디렉토리, 파일명 분리 1 마라톤맨 2012-02-08 7509
20 정규표현식 020. IP 주소 유효성 검사 2 마라톤맨 2012-02-06 6301
19 정규표현식 019. IP 주소 유효성 검사 1 마라톤맨 2012-02-02 52907
18 정규표현식 018. 하위 표현식 3 마라톤맨 2012-01-30 4870
17 정규표현식 017. 하위 표현식 2 마라톤맨 2012-01-27 4014
16 정규표현식 016. 하위 표현식 1 마라톤맨 2012-01-25 5745
15 정규표현식 015. 최대 매치와 최소 매치 2 마라톤맨 2012-01-20 4414
14 정규표현식 014. 최대 매치와 최소 매치 1 마라톤맨 2012-01-18 7618
13 정규표현식 013. 검색할 위치 2 마라톤맨 2012-01-16 4555
12 정규표현식 012. 검색할 위치 1 마라톤맨 2012-01-13 5129
11 정규표현식 011. 검색 문자 개수 지정하기 머니북 2012-01-12 8882
10 정규표현식 010. 웹 서버 설정에도 필요 머니북 2012-01-11 7401