본문 바로가기
다양한 TIP

정규표현식(regex)에서 "?=", "?!"의 의미는 무엇일까요?

by 유기농프로그래밍 2022. 10. 24.
반응형

정규표현식(regex)의 특수한 일을 하는 특수문자

정규표현식을 보다보면, 의미가 있는 특수문자들이 있습니다.

 

(?!) (?=) 과 같은 뭐지(?) 싶은 문자들이 있는데요.

이건 바로 전후방탐색이라는 Lookaround 를 의미합니다.

regexr.com 로 예시를 스크린샷하여 설명드리겠습니다.

 

전방탐색(Positive lookahead) - (?=)

전방탐색은 앞에서부터 탐색을 하며 해당 문자열은 포함시키지 않습니다.

Lookahead 라 불리는데, 한번 예시로 알아보겠습니다.

 

돈을 regex로 추출할 때 돈의 단위는 빼고 숫자만 추출하고 싶다면 어떻게 해야할까요?

단순하게 숫자만 본다고 한다면 \d+ 면 끝나겠죠?

하지만, 이 숫자 뒤에 돈의 단위를 나타내는 단어까지 검색하고 그 숫자만 보여주고 싶다면 어떻게 표현할 수 있을까요?

이 때 필요한게 전방탐색, 바로 ?=를 이용할 때입니다.

\d+(?=원)

이렇게 쓰게 되면 뒤에 원이 붙어 있는 숫자들만 보이게 됩니다.

regex 전방탐색
regexr.com 참고

후방탐색(Positive lookbehind) - (?<=)

후방탐색은 뒤에서부터 탐색을 하며 해당 문자열은 포함시키지 않습니다.

Lookbehind 라 불리는데, 한번 예시로 알아보겠습니다.

 

동일하게 돈에 관련된 예시로 보겠습니다.

이번엔 원이 아니라 앞에 붙이는 $에 대한 숫자를 보여주고 싶다면 어떻게 표현할 수 있을까요?

이 때 필요한게 후방탐색, 바로 ?<=를 이용할 때입니다.

(?<=\$)\d+

이렇게 쓰게 되면 뒤에 $가 있는데, $를 뺀 숫자들만 보이게 됩니다.

($는 맨 앞이라는 의미가 있기 때문에 그 의미를 빼기 위해 \를 이용해 일반문자로 바꿔준 것입니다)

regex 후방탐색
regexr.com 참고

혼용사용

앞에는 '$' 뒤에는 '원' 인 숫자를 추출한다고 가정한다면 어떻게 할까요? 바로 전방, 후방탐색을 모두 사용하면 됩니다.

(?<=\$)\d+(?=원)

regex 전후방탐색 예시
regexr.com 참고

요약하자면 아래와 같습니다.

후방탐색 단어 전방탐색

(?<=[후방탐색])매칭될 문자열(?=[전방탐색])

 


이번엔 부정형을 의미하는 !가 들어간 탐색을 알아보겠습니다.

 

부정형 전방탐색(Negative lookahead) - (?!)

부정형 전방탐색은 전방탐색과 유사합니다. 다만 부정형이 붙어있다는 것이 포인트입니다.

 

부정형을 단순하게 말하면 없어야한다는 의미이죠.

부정형 전방탐색의 키는 바로 ?!입니다.

 

아까 예를 들은 "숫자+원"을 다시 예로 들어보자면, 숫자 + 원이 없는 것만 탐색되게 됩니다.

100원이라면 원이 들어있는 원 앞에있는 숫자 0은 매칭되지 않겠죠. 예를 들어 보면 좀 더 이해가 쉬울 것입니다.

\d+(?!원)

이렇게 쓰게 되면 뒤에 원이 붙어 있지 않은 숫자들만 보이게 됩니다.

regex 부정형 전방탐색 예시
regexr.com 참고

부정형 후방탐색(Negative lookbehind) - (?<!)

부정형 후방탐색도 후방탐색과 유사합니다. 똑같이 부정형이 붙어있다는 것이 포인트이죠.

 

부정형을 단순하게 말하면 없어야한다는 의미이죠.

부정형 후방탐색의 키는 바로 ?<!입니다.

 

아까 예를 들은 "$+숫자"을 다시 예로 들어보자면, "$ + 숫자"가 없는 것만 탐색되게 됩니다.

$100 라면 $가 붙어있는 숫자 1은 매칭되지 않겠죠. 예를 들어 보면 좀 더 이해가 쉬울 것입니다.

(?<!\$)\d+

이렇게 쓰게 되면 앞에 $가 붙어 있지 않은 숫자들만 보이게 됩니다.

regex 부정형 후방탐색 예시
regexr.com 참고

 

반응형

댓글