정규표현식 전후방탐색(look-around)

Lian Kim·2022년 8월 28일
0

어떤 패턴을 기준으로 그 패턴과 일치하는 문자열을 찾고자 하는게 아니라, 그 패턴의 직전에 위치하는 문자열이나 직후에 위치하는 문자열을 찾고 싶을 때는 전후방탐색(look-around)을 사용하면 된다.


전후방탐색이란 어떤 문자열이 패턴에 일치하지만 이를 값으로 리턴하지 않는 정규표현식 패턴이다. 크게 전방탐색(look-ahead)과 후방탐색(look-behind)으로 나눌 수 있는데, 쉽게 말하면 각각의 기호 뒤에 위치하는 문자열을 기준으로 패턴을 앞쪽에서 탐색하는 것이 전방탐색, 뒷쪽에서 탐색하는 것이 후방탐색이다. 기준이 되는 문자열은 포함하지 않는다.

  • 전방탐색: ?= 뒤의 문자열을 바로 뒤에 가지고 있는 (=> 해당 문자열 직전까지)
  • 후방탐색: ?<= 뒤의 문자열을 바로 앞에 가지고 있는 (=> 해당 문자열 직후부터)



📌 전방탐색(look-ahead)

전방탐색의 기호는 ?=이며, 기호 다음에 기준이 될 패턴 문자열이 오는 하위표현식이다. 하위표현식과 동일하게 소괄호로 감싸주어야 한다.

전방탐색의 대표적인 예시인 URL에서 프로토콜만 추출하는 문제를 보자.

http://www.liankim.com  
https://www.liankim.com 
ftp://192.23.56.189
/^.+(?=:)/gm
  • ^ : 문자열 맨 앞에 있고
  • .+ : 한 글자 이상이고
  • (?=:) : 바로 뒤에 ':'이 있는

-> 문자열 맨 앞에 있는 : 직전까지의 한 글자 이상의 문자열




📌 후방탐색(look-behind)

후방탐색의 기호는 ?<=이며, 기호 다음에 기준이 될 패턴 문자열이 오는 하위표현식이다. 전방탐색 기호의 ?와 = 사이에 < 기호가 추가되었다. 마찬가지로 소괄호로 감싸주어야 한다.

같은 예제에서 후방탐색을 사용하여 도메인/ip 주소만 추출해보자

http://www.liankim.com  
https://www.liankim.com 
ftp://192.23.56.189
/(?<=\/{2}).+/gm
  • \/{2} : /가 두 번 연속되는
  • (?<=\/{2}) : 바로 앞에 연속되는 두 개의 /가 있는
  • .+ : 한 글자 이상인

-> // 바로 뒤에 위치하는 한 글자 이상의 문자열
(예제는 도메인/ip 주소 이후 아무것도 존재하지 않으므로 뒷부분을 고려하지 않음)

http://www.liankim.com
https://www.liankim.com
ftp://192.23.56.189




전방탐색 + 후방탐색

전방탐색과 후방탐색을 같이 사용하면 후방탐색 기준 패턴과 전방탐색 기준 패턴 사이의 문자열을 찾을 수 있다.

전방탐색과 후방탐색을 같이 사용하여 HTML body에서 <li> 태그 안에 있는 문자열을 찾아보자.

<ul>
  <li>kim</li>
  <li>lian</li>
</ul>
/(?<=\<li\>).*(?=\<\/li\>)/gm
  • (?<=\<li\>) : 앞에 <li>가 있는
  • .* : 0자 이상인 (문자가 없거나 있거나 많거나)
  • (?=\<\/li\>) : 뒤에 </li>가 있는

-> <li></li> 사이에 위치하는 문자열

<ul>
     <li>kim</li>
      <li>lian</li>
</ul>




참고 자료
https://junstar92.tistory.com/373

0개의 댓글