Regex Lookaround match 란?
일치하는 텍스트를 매칭하고 싶을 때가 아니라, 일치하는 텍스트의 앞, 뒤를 매칭하고 싶을 때 사용하는 정규표현식이다.
- 전방 탐색 (Positive Lookingahead)
(?=)
- 후방 탐색 (Positive Lookingbehind)
(?<=)
- 부정형 전방 탐색 (Negative Lookahead)
(?!)
- 부정형 후방 탐색 (Negative Lookbehind)
(?<!)
소비 개념 알아보기
정규표현식에서 일치하는 영역을 반환하는 동작을 소비(consume)
라고 표현한다. 보통 Regex Lookaround match
는 소비(consume)
를 원하지 않을 때 사용한다.
예제
<html>
<title>제목</title>
</html>
<title></title>
태그 안에 있는 내용만 얻고 싶다면?
Regex Lookaround
를 이용하지 않는다면?
- 하위표현식을 이용해 데이터를 자른다. 정규표현식에서
()
와 같이 괄호로 나누면 그룹별로 데이터를 뽑기 좋다. - 혹은
<title>.*</title>
매칭 후replace()
를 이용해<title></title>
부분은 제거해준다.
그런데 우리는 Regex Lookaround
를 이용할 것이다.
전방 탐색(Lookahead) 이용해보기
.*(?=<title>)
?=
기호를 이용해 전방 탐색을 이용할 수 있다.- 특정 기호를 제외하고 그 기호의 앞 글자들을 매칭시키는데 유용하다.
<title>
을 제외한 앞부분이 매칭되었다.
후방 탐색(Lookbehind) 이용해보기
(?<=<title>).*
?<=
기호를 이용해 후방 탐색을 이용할 수 있다.- 특정 기호를 제외하고 그 기호의 뒤 글자들을 매칭시키는데 유용하다.
<title>
을 제외한 뒷부분이 매칭되었다.
몇몇 브라우저에서는 후방탐색 자체를 지원 안하니 주의해야 한다.
사파리는 후방탐색을 지원하지 않는다.
전방 탐색과 후방 탐색 함께 이용하기
(?<=<title>).*(?=<\/title>)
드디어 문제를 해결했다.
- 전방탐색과 후방탐색은 같은 정규표현식 내에서 얼마든지 계속 사용 가능하다.
<title>
뒷부분이면서,</title>
의 앞부분을 매칭한다.
부정형 후방탐색 이용하기
I paid $30 for 100 apples,
50 oranges, and 60 pears.
I saved $5 on this order.
여기서 숫자를 뽑고 싶지만, $
뒤에 있는 숫자는 제외하고 싶다면?
\b(?<!\$)\d+\b
위와 같이 부정형 후방 탐색을 이용할 수 있다.
레퍼런스
'정규표현식' 카테고리의 다른 글
전방 탐색과 후방 탐색 (Regex Lookaround match) 이란? (0) | 2023.04.04 |
---|---|
정규표현식 ? (물음표) 기호 사용법 (non-greedy matching, lazy-quantifier) (0) | 2023.04.02 |