Media Log


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

  1. 감사합니다 at 2013.07.24 12:26 신고 [edit/del]

    내용 깔끔하고 좋네요 ㅎㅎ 감사합니다!!

    Reply
  2. jay8126 at 2013.10.18 10:33 신고 [edit/del]

    정규식 강좌 잘 보았습니다. 감사합니다! ^^

    Reply
  3. 오호 at 2014.03.13 14:02 신고 [edit/del]

    무척 도움되었습니다. 감사합니다. ^^

    Reply
  4. 정규식 최고 at 2014.04.25 10:45 신고 [edit/del]

    정말 잘 읽었습니다. ^^ 감사합니다.

    Reply
  5. 하얀액생각 at 2014.10.05 22:06 신고 [edit/del]

    유용한 정보 감사합니다.
    그런데 전방 후방 탐색을 동시에 사용할수도 있는 건가요 ?

    Reply
  6. at 2015.02.24 15:04 신고 [edit/del]

    너무 잘 정리해두셨네요! 도움이 너무 많이 되었어요. 링크 걸어놓고 필요할때 떠 꺼내봐야겠어요! 정말 감사합니다!!>0<

    Reply
  7. Jerry at 2016.04.11 11:56 신고 [edit/del]

    많은 도움이 되었습니다. 감사합니다.

    Reply
  8. ygh at 2017.01.06 11:37 신고 [edit/del]

    정말 감사합니다~ 어렵기만했던 Regex 알려주신건 대부분 이해하고갑니다 ^^

    Reply
  9. jwk at 2017.02.02 16:24 신고 [edit/del]

    한번에 쭉 봤습니다.
    정리가 정말 잘 되어있네요.^^

    Reply
  10. 날씨 at 2017.06.07 11:00 신고 [edit/del]

    그동안 계속 살펴보기를 미루고 있었는데, 간략하게 필요한 부분만 잘 설명해 주셔서 큰 도움이 되었습니다. 감사합니다

    Reply
  11. at 2017.12.26 23:41 신고 [edit/del]

    넘좋아요 감사합니다!

    Reply
  12. 코딩초보 at 2018.01.13 13:14 신고 [edit/del]

    정규표현식을 이해하는데 도움이 많이 되었습니다. 감사합니다!

    Reply
  13. 손종욱 at 2018.03.15 13:42 신고 [edit/del]

    첨부터 끝까지 다보는데 시간도 얼마안걸립니다
    가르쳐준 내용으로 많은것을 할수있을꺼같네요

    Reply
  14. 초보 at 2018.06.21 17:13 신고 [edit/del]

    정규 표현식 막연했는데 정말 많은 도움이 되었습니다.
    감사합니다 ~

    Reply

submit

티스토리 툴바