본문 바로가기
Java/About Java

[Java] 정규표현식, Lookaround(Lookahead & Lookbehind)

by seaweed_one 2023. 10. 15.
728x90

안녕하세요~
오늘은 정규표현식에 대한 글로 찾아왔습니다.
정규표현식은 Regular Expression 줄여서 정규식, RegExp 라고 표현하기도 합니다.
 
사실 개발할 때 정규식을 쓰긴 해도 보통 패턴이 일치 여부 확인 용도로 사용하곤 했는데요.
오늘은 일치하는 텍스트의 앞, 뒤를 매칭할 때 사용할 수 있는 Lookaround에 대하여 알아보려고 합니다.
 
보편적인 정규표현식의 사용은 아래 링크를 참조해주세요.
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

정규 표현식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 노란색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다. 스티븐 클레이니는 정규 표현식의 개념을 설립한 공로자이다. 정규 표현식(正規表現式, 영어: r

ko.wikipedia.org

 
Lookaround 에는 Lookahead와 Lookbehind의
 

명칭패턴매치
Positive Lookahead
전방탐색
X(?!Y)X 뒤에 Y 가 연속해서 존재하는 경우 X와 매치
negative Lookahead
부정형 전방탐색
X(?=Y)X 뒤에 Y 가 따라오지 않는 경우  X와 매치
Positive  Lookbehind
후방탐색
(?<=Y)XY뒤에 연속해서 존재하는 X를 찾아 매치
negative Lookbehind
부정형 후방탐색
(?<!Y)XX 앞에 Y 조건이 존재하지 않는 경우에만 X와 매치

전방탐색과 후방탐색의 용어가 헷갈리실 수도 있는데 저는 조건 Y의 앞을 탐색하면 전방, 조건의 뒤를 탐색하면 후방이라고 생각하니 이해가 편했습니다.
 
또 하나의 특징은 결과가 소모되지 않는다는 것인데요.
패턴을 찾은 뒤 소모되는 것이 아니라 계속해서 패턴을 찾습니다.
 
이러한 특징을 활용해서 응용방법을 알아볼까요?
lookbehind 예제를 먼저 살펴보겠습니다.
문자열을 자르는 예제를 가지고 왔는데요.
랜덤한 길이의 문자열을 n 개씩 자르고 싶을 때 Lookaround를 응용하면 for 문을 사용하지 않고도 자를 수 있습니다.
(? <=Y) X 식에 조건을 넣어줍니다.

str.split("(?<=\\G.{" + length + "})")

정규식을 사용해 문자열을 자르는 간단한 코드입니다.
해당 코드를 이용해서 아래와 같이 문자열을 원하는 크기대로 자를 수 있습니다.

 
한 가지 예시를 더 들어보겠습니다.
아래와 같은 정규식을 사용해 $380과 같은 경우에 $뒤의 숫자만 매칭시킬 수 있습니다.

(?<=\$)[0-9.]

이렇게 조건인 $뒤의 숫자가 매칭됩니다.

 
마찬가지로 전방탐색도 표현식을 활용해 원하는 문자를 추출할 수 있습니다.

 
머리를 식힐 겸 풀어본 코테 문제가 이렇게 포스팅으로 이어지게 되었네요.
궁금하신 점은 댓글 남겨주시면 제가 아는 한도 내에서 답변드리겠습니다.
 
읽어주셔서 감사합니다 ^ㅇ^

728x90