지난 회에서는 드라이브명을 빼고 그 뒤의 문자열만 추출했습니다. 이때 드라이브명은 문자열의 앞(정규식 표현으로는 후방)에 있으므로 후방 탐색을 사용했습니다. 이제 나머지 문자열에서 파일명만 따로 빼야 합니다. 어떻게 해야 할까요?
“드라이브명이 후방에 있는데 반해 파일명은 전방에 있으니까 전방탐색을 사용하면 되지 않을까?”
과연, 대단하십니다. 정답입니다. 문제는 패턴입니다. 정규식을 작성할 때는 그 전제로 패턴의 파악이 무엇보다 중요합니다. 문자열의 패턴을 알아야 정규식을 작성하든가 말든가 할테니까요.
그런데 디렉토리나 파일이나 사실 패턴이 같습니다. 둘 다 영문자, 숫자, 언더바, 몇 가지의 특수문자 등으로 구성되며 확장자가 있을 수도, 없을 수도 있습니다. 결국 이 둘을 구분하는 방법은 하나뿐입니다.
주어진 문자열에 파일명이 포함되어 있는 게 확실한 경우는 문자열의 가장 나중에 나타나는 백슬래시(\) 다음의 문자열이 파일명입니다. 주어진 문자열에 파일명이 포함될 수 있고 아닐 수도 있다고 한다면 사실상 이 둘을 구분하는 것은 불가능합니다. 가령 c:\abc라는 문자열에서 abc는 디렉토리가 될 수도 있고 파일이 될 수도 있습니다. 물론 프로그래밍 언어에서라면 이런 고민은 애초에 할 필요가 없습니다. 주어진 문자열 경로가 디렉토리인지 파일인지를 판별하는 함수를 쓰면 되니까요.
여기서는 주어진 문자열에 파일명이 포함되어 있다고 가정하겠습니다. 따라서 문자열의 가장 나중에 나타나는 백슬래시를 찾은 다음 그 뒤의 문자열을 후방 탐색 처리하면 됩니다. 아래와 같겠네요.
(?<=[a-zA-Z]:).+\\(?=.+)
두 번째 괄호 안에 있는 것이 후방 탐색입니다. 이때 쓰인 기호 ?=가 후방 탐색 메타문자고요. 울트라 에디트에 아래와 같은 문자열들을 입력한 뒤 위의 정규식으로 검색하면 제대로 찾는 것을 볼 수 있습니다.
c:\windows\system32\abc.dll
c:\data\abc.dll
d:\images\web\common.gif
그럼 파일명만 추출하는 것은 어떻게 될까요? 생각하기에 따라서는 무지하게 쉬울 수도, 무지하게 어려울 수도 있습니다. 여기서 힌트는 파일명이 문자열의 가장 끝 부분에 위치한다는 점입니다. 즉, 문자열이 어떤 패턴에 의해서 끝나면 됩니다. 답은 다음 회에 알려드리죠.