정규표현식 024. 숙제와 답

조회 수 10068 추천 수 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
번호 제목 글쓴이 날짜 조회 수sort
29 정규표현식 019. IP 주소 유효성 검사 1 마라톤맨 2012-02-02 98012
28 정규표현식 023. 정규식의 옵션과 여러 정규식 엔진들 마라톤맨 2012-02-15 68175
27 정규표현식 025. 자바스크립트의 정규식 1 마라톤맨 2012-02-22 31646
26 정규표현식 022. 드라이브명과 디렉토리, 파일명 분리 2 마라톤맨 2012-02-13 23606
25 정규표현식 011. 검색 문자 개수 지정하기 머니북 2012-01-12 21315
24 정규표현식 029. 자바스크립트의 정규식 5 마라톤맨 2012-03-28 15492
23 정규표현식 021. 드라이브명과 디렉토리, 파일명 분리 1 마라톤맨 2012-02-08 13535
22 정규표현식 010. 웹 서버 설정에도 필요 머니북 2012-01-11 13306
21 정규표현식 014. 최대 매치와 최소 매치 1 마라톤맨 2012-01-18 12517
20 정규표현식 007. 메타문자 2 마라톤맨 2012-01-08 12361
19 정규표현식 026. 자바스크립트의 정규식 2 마라톤맨 2012-02-27 11045
18 정규표현식 020. IP 주소 유효성 검사 2 마라톤맨 2012-02-06 10755
17 정규표현식 016. 하위 표현식 1 마라톤맨 2012-01-25 10209
» 정규표현식 024. 숙제와 답 마라톤맨 2012-02-17 10068
15 정규표현식 018. 하위 표현식 3 마라톤맨 2012-01-30 10005
14 정규표현식 012. 검색할 위치 1 마라톤맨 2012-01-13 9416
13 정규표현식 027. 자바스크립트의 정규식 3 마라톤맨 2012-03-02 9324
12 정규표현식 028. 자바스크립트의 정규식 4 마라톤맨 2012-03-09 9131
11 정규표현식 015. 최대 매치와 최소 매치 2 마라톤맨 2012-01-20 9097
10 정규표현식 006. 메타문자 1 마라톤맨 2012-01-07 8971