본문 바로가기
카테고리 없음

[Regex] Look Around

by 슥짱 2023. 1. 26.

특정 문자열의 앞, 뒤 찾기


정규 표현식을 사용하다보면 특정 문자열의 앞 뒤에 있는 문자열을 구해야 하는 경우가 자주 있다. 예를 들어 "1월 26일 코로나 감염자 수 1000명"이라는 문자열이 있을 때, 이 중 감염자 수를 의미하는 "1000" 만을 얻고자 한다면 다음과 같이 구할 수 있다.

const str = '1월 26일 코로나 감염자 수 1000명'
const reg = /(\d+)명/;
str.match(reg); // ['1000명', '1000', index: 0, input: '1000명', groups: undefined]

 

이와 같은 정규표현식을 사용하면 우리에게 필요하지 않은 "1000명"까지 구하게 되는데, Positive Look Ahead 표현을 사용하면 더 깔끔하게 구할 수 있다. Positive Look Ahead는 `A(?=B)`의 형태로 작성한다.. 여기서 A는 찾고자 하는 문자열, B는 기준 문자열이다. 코드를 보면 쉽게 이해할 수 있을 것이다.

const str = '1월 26일 코로나 감염자 수 1000명'
const reg = /\d+(?=명)/;
str.match(reg); // ['1000', index: 17, input: '1월 26일 코로나 감염자 수 1000명', groups: undefined]

 

또 다른 예시로, "https://www.naver.com" 또는 "http://youtube.com"과 같은 URL에서 앞 부분의 스킴을 떼고 그 뒤의 문자열을 얻고자 하는 경우엔 Positive Look Behind를 사용할 수 있다. Positive Look Behind는 `(?<=B)A`의 꼴로 사용한다. 

const url = 'https://www.naver.com';
const regex = /(?<=https?:\/\/)[\[\w.]+/;

const urlWithoutScheme = url.match(regex); //['www.naver.com', index: 8, input: 'https://www.naver.com', groups: undefined]

 

위 예시들과 반대로, 특정 문자열이 붙어있지 않은 문자열을 찾을 때엔 Negative Look Ahead/Behind를 사용한다. 이들의 표현식은 아래에 표로 정리해 두었다.

Positive Look Ahead A(?=B)
Negative Look Ahead  A(?!B)
Positive Look Behind (?<=B)A
Negative Look Behind  (?<!B) A

단 Look Behind는 IE, IOS 사파리 등 일부 부라우저에서 지원되지 않으므로 브라우저 환경에서의 사용은 주의할 필요가 있을듯 하다.

Look Behind를 지원하지 않는 일부 브라우저

 

참고자료


https://elvanov.com/2388

 

정규표현식 Lookahead, Lookbehind 기능 이해하기 – Under The Pencil

개요 Lookahead, Lookbehind 기능은 다소 고급 문법에 속합니다. 자 일단 선 요약하면 다음과 같습니다. 패턴타입matchesX(?=Y)Positive lookaheadX if followed by YX(?!Y)Negative lookaheadX if not followed by Y(?<=Y)XPositive

elvanov.com

 

댓글