전방탐색과 후방탐색
어디서 텍스트를 찾을지 지정하고 싶을 때 전후방탐색(lookaround)을 사용합니다.
일부 정규 표현식 문서에서는 일치하는 영역을 반환하는 작동을 표현할 때 '소비한다(consume)'는 용어를 씁니다. 반면 전후방탐색은 '소비하지 않는다'고 말할 수 있습니다.
전후방탐색 일치는 실제로 결과를 반환하지만 반환된 문자의 길이가 항상 0입니다. 따라서 전후방탐색은 흔히 '제로 폭(zero-width)'이라고 불립니다.
모든 하위 표현식 앞에 ?=
나 ?<=
를 붙이면 전후방탐색 표현으로 바꿀 수 있습니다.
전방탐색
전방탐색 패턴의 구문은 ?=
로 시작하고 =
다음에 일치할 텍스트가 오는 하위 표현식입니다.
예를 들어 각 URL에서 프로토콜의 위치를 추출하고 싶다면 .+(?=:)
을 이용할 수 있습니다. 이 정규 표현식과 .+(:)
의 차이는 :
을 검색 결과에 포함시키는지 여부입니다.
후방탐색
후방탐색 연산자는 ?<=
입니다. 사용 방법은 전방탐색과 동일합니다.
전방탐색 패턴은 .
와 +
를 포함하여 텍스트의 길이를 다양하게 일치시킬 수 있으며 매우 동적입니다. 반면 후방탐색 패턴은 보통 일치시킬 텍스트의 길이를 고정해야 합니다.
HTML 제목의 텍스트만 추출하고 싶다면 전방탐색과 후방탐색을 함께 사용해 다음과 같은 정규 표현식을 작성할 수 있습니다.
(?<=<[tT][iI][tT][lL][eE]>).*(?=<\/[tT][iI][tT][lL][eE]>)
(?<=<[tT][iI][tT][lL][eE]>).*(?=<\/[tT][iI][tT][lL][eE]>)
이 예시에서는 혼란을 방지하고자 <
을 이스케이프하는 편이 좋을 수 있습니다.
부정형 전후방탐색
부정형(negative) 전후방탐색은 많이 쓰이지 않는 기능으로 지정한 패턴과 일치하지 않는 텍스트를 찾습니다.
전후방탐색 명령에서 부정형을 나타낼 때는 =
대신 !
를 사용합니다.
종류 | 긍정형 | 부정형 |
---|---|---|
전방탐색 | (?=) | (?!) |
후방탐색 | (?<=) | (?<!) |
다음 정규 표현식은 앞에 $
가 없는 숫자를 찾습니다.
\b(?<!\$)\d+\b
\b(?<!\$)\d+\b