1. 전방 탐색(lookahead)

전방 탐색(lookahead)이란 작성한 패턴에 일치하는 영역이 존재하여도 그 값이 제외되어서 나오는 패턴입니다. 전방 탐색 기호는 ?= 이며, = 다음에 오는 문자가 일치하는 영역에서 제외됩니다. 또한, 전방 탐색은 하위 표현식과 같이 소괄호로 감싸주어야만 합니다. 우선은 한번 보도록 합시다.

 

Reg. Expression:

.+(?=:)

Text:

http://www.abc.com
https://www.abc.com
http://www.abc.net

 

위에 쓰인 정규 표현식을 살펴보자면, 아무 문자가 한번 이상 연속적으로 등장하고 콜론(:) 문자가 등장하는 문자열 중에서, 콜론(:) 문자는 일치하는 영역에서 제외됩니다. 만약, 전방 탐색 기호를 쓰지 않고 콜론을 그대로 썼었다면, 콜론이 일치되는 영역에서 제외되지 않고 포함되어 버립니다. http가 아닌 http:, https가 아닌 https: 처럼 말이죠. 예를 하나 더 보도록 합시다.

 

Reg. Expression:

.+(?=원)

Text:

1000
2000
3000
5000
10000

 

위에 쓰인 정규 표현식에서는, 전의 예제에서 콜론이 아닌 "원"으로 바뀌었습니다. 이제부터, "원"이란 문자는 일치 영역에서 제외됩니다. 일치된 영역을 보시면 모두, "원"을 제외하고 "원"이 등장하기 전의 문자열들이 일치했음을 확인하실 수 있습니다.

 

2. 후방 탐색(lookbehind)

 

이번에는 후방 탐색입니다. 전방 탐색이 앞에 있는 문자열을 탐색하는 것이라면, 후방 탐색은 뒤에 있는 문자열을 탐색합니다. 후방 탐색의 기호는 ?<= 입니다. 전방 탐색 기호의 ?와 = 사이에 < 기호가 추가된 것입니다. 후방 탐색도, 전방 탐색의 사용법과 똑같습니다. (마찬가지로, 소괄호로 감싸주어야만 합니다.) 한번 아래 예제를 보도록 합시다.

 

Reg. Expression:

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

Text:

1: $600.4
2: $10.25
3: $47.33
4: $112.34

 

위에 쓰인 정규 표현식을 살펴보니, 후방 탐색 기호 뒤에 메타 문자인 $가 쓰였습니다. 그렇기에, \로 이스케이프 해주어야 합니다. 그 후에, 숫자와 점으로 구성된 문자 집합이 연속된 문자열을 탐색합니다. 일치된 텍스트를 살펴보시면, $ 기호 뒤에있는 문자들만 일치했음을 확인하실 수 있습니다. 예제 하나를 더 보도록 합시다.

 

Reg. Expression:

(?<=,)[a-z\s!]+

Text:

Hello, world!

 

위에 쓰인 정규 표현식을 살펴보면, 후방 탐색 기호 뒤에 , 문자가 쓰였습니다. 그 뒤에는, 소문자와 공백(\s) 그리고 ! 문자로 구성되어 있는 문자 집합이 연속된 문자열을 탐색합니다. 일치된 텍스트를 살펴보시면, ',' 문자가 제외된 나머지 문자들이 일치했음을 확인하실 수 있습니다. 이해 되시죠? 참고로, 전방 탐색과 후방 탐색은 너비가 0이며, 역참조가 불가능 하다는 것을 알아두시면 좋겠습니다.

 

3. 부정형 전후방탐색(negative lookaround)

 

이번에는 "부정형" 전후방탐색이라는 것에 주의를 하시기 바랍니다. 전에 보았던 탐색 기호들은 모두 "긍정형" 탐색이었습니다. 아래 표를 한번 보도록 합시다.

 



탐색 기호
설명


(?=)
긍정형 전방탐색
(?!)
부정형 전방탐색
(?<=)
긍정형 후방탐색
(?<!)
부정형 후방탐색

 

위의 표에서 부정형 탐색 기호에 ! 문자가 들어갔음을 확인하실 수 있습니다. 긍정형 전방탐색이 = 뒤에 있는 문자와 일치하는 텍스트를 탐색하는 것이라면, 부정형 전방탐색은 일치하지 않는 텍스트를 탐색하는 것입니다. 후방탐색도 이와 마찬가지 입니다. 한번 긍정형 후방탐색과 부정형 후방탐색이 어떠한 차이점이 있는지 예제를 통해 살펴보도록 합시다.

 

Reg. Expression:

\b(?<!\$)\d+

Text:

$10 5 $6 77 $788

 

위에 쓰인 정규 표현식을 살펴보면, 단어 경계(\b)와 부정형 후방탐색(?<!)이 쓰였고, 부정형 후방탐색 기호 뒤에 $ 문자가 등장했습니다. 그 후에는 연속된 숫자(\d+)를 의미하죠? 정리하자면, $ 뒤에 숫자가 들어간 영역은 제외하겠다는 소리입니다. $가 안들어가고 숫자만 달랑 있는 영역만 탐색하는 것입니다. 단어 경계만 설명을 보충하자면, 단어와 단어를 구분짓는 경계입니다. 여기서는 공백이 단어와 단어를 구분짓는 경계인 셈이죠. 이해되셨나요?

 

아쉽지만 전후방탐색(lookaround)에 대한 설명은 여기서 그만 마치도록 하겠습니다. 여기까지 읽어주셔서 감사하고, 수고하셨습니다. 정규 표현식 강좌는 전후방탐색을 마지막으로 마무리하려고 합니다. 다시 한번 수고하셨습니다.