Atomic Habits

정규식 - 긍정형/부정형 전방/후방 탐색 - 의미와 상세 예시 본문

IT/Regular Expressions

정규식 - 긍정형/부정형 전방/후방 탐색 - 의미와 상세 예시

체계성 2022. 5. 27. 22:30

https://regexr.com/

 

4. 긍정형/부정형 전방/후방 탐색

* 긍정형은 찾아 달라는 의미이고, 부정형은 찾지 말아달라는 의미이다.

* 전방 : (괄호)를 기준으로 궁극적으로 출력하고자 하는 문자열이 앞에 있다. (?=) , (?!)
* 후방 : (괄호)를 기준으로 궁극적으로 출력하고자 하는 문자열이 뒤에 있다. (?<=) , (?<!)


* 긍정형 전방탐색 - 앞으로 찾기
일치하는 텍스트는 찾되 텍스트 자체는 소비(consume, 출력) 않고,  그 앞에 무엇이 오는지 출력한다.

* 긍정형 후방탐색 - 뒤로 찾기
일치하는 텍스트는 찾되 텍스트 자체는 소비(consume, 출력) 않고,  그 뒤에 무엇이 오는지 출력한다.

* 부정형 전방탐색 - 앞으로 찾기
불일치하는 텍스트 문자열 제외하고(소비하지 않고), 그 앞에 무엇이 오는지 출력한다.

* 부정형 후방탐색 - 뒤로 찾기
불일치하는 텍스트 문자열 제외하고(소비하지 않고),  그 뒤에 무엇이 오는지 출력한다.

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

------------------------------------------------
예시 
문자열 : /Add_it/applylist?field=&query=&currentPage=2 -> 

(?<=\\&).+  --->  query=&currentPage=2

(?<=field=\&).*(?=\&)  --->  query=

(?<=field=).*(?=\\&query)  --->  ""

문자열 :  /Add_it/applylist?field=aa&query=&currentPage=2 -> 
(?<=field=).*(?=\\&query)  --->  aa

문자열 : /Add_it/applylist?field=aa&query=bb&currentPage=2
(?<=query=).*(?=\\&currentPage)  --->  bb

(?<=currentPage=)\\d* ---> 2
------------------------------------------------
* 긍정형 전방/후방 탐색
일치 조건에 포함은 시키되, 최종 결과에는 제외시켜달라는 의미이다.(=소비하지 않는다)

정규표현식 : (긍정형 전방탐색)(기본 정규표현식)
(긍정형 전방탐색) 조건과 (기본 정규표현식) 조건 동시에 만족하는 텍스트를 찾되 (기본 정규표현식) 만 출력한다.

전방 (?<= 표현식)
후방 (?= 표현식 )

(?<= \\<\\w+\\>) .* (?= \\<\\/\\w+\\>)
(?<= \\<([Tt][Ii][Tt][Ll][Ee])\\>) .*? (?= \\<\\/\\1\\>)
<TITLE>SooKkaRak's homepage</TITLE>

* 부정형 전방/후방 탐색
부정형 탐색은 비교적 덜 쓰는 방법이다.

부정형 전방 탐색
정규표현식 : (부정형 전방탐색)(기본 정규표현식)
(부정형 전방탐색) 조건과는 일치하지 않고 (기본 정규표현식) 조건만 일치하는 텍스트를 찾고,

부정형 후방 탐색도 이와 비슷하게, 뒤쪽에서 지정한 패턴과 일치하지 않는 텍스트를 찾는다.

* 
부정형 전후방 탐색은 다음과 같이 사용한다.
부정형 전방 탐색 (?!)   vs   (?=) 긍정형 전방 탐색
부정형 후방 탐색 (?<!)  vs   (?<=) 긍정형 후방 탐색

즉, 긍정형 전후방 탐색의 = 대신 !를 사용하면 된다.

* 예문
서울 성북군 서성동 1번지
동읍리면 기준 앞 글자 선택 : .*[동,읍,리,면](?<!\\s)
동읍리면 기준 뒷 글자 선택 : (?<=[동]\\s).*

* 예문
다음은 긍정형 후방 탐색과 부정형 후방 탐색 사이에 어던 차이가 있는지 알아보는 예제이다.
예제 본문에 가격과 수량을 나타내는 숫자들이 있다.
우선 간단하게 가격만 얻어보자.

[예문]
I paid $30 for 100 apples, 50 oranges, and 60 pears.
I saved $5 on this order.

[긍정형 후방탐색]  (?<=\\$)  \\d+

[결과]
30
5

이번에는 가격이 아니라, 수량을 찾아보자.
[부정형 후방탐색]   (?<!\\$)  \\d+

[결과]
0 100 500 60

$30의 0 역시 $ 다음 위치가 아니기에 덩달아 같이 결과에 포함되어 버렸다.
이럴 땐 깔끔하게 단어 경계를 붙여 문제를 해결하면 되겠다.
\\b : 앞 혹은 뒤에 문자, 숫자, 특수문자 등이 오지 않고 다른 단어와 경계가 있어야 한다는 조건이다.

[부정형 후방탐색 + 단어 경계조건]   \\b  (?<!\\$)  \\d+  \\b

[결과]
100 500 60
좋아요공감
공유하기
통계
글 요소
 
 

'IT > Regular Expressions' 카테고리의 다른 글

\b vs \B  (0) 2022.06.17
vim 정규식(전방탐색 후방탐색)  (0) 2022.05.27
[정규식] 조건문  (0) 2021.12.05
[정규식] 옵션 정리(광범위)  (0) 2021.12.05
[정규식] 그룹(group) 재참조  (0) 2021.12.05
Comments