탐욕적 수량자(Greedy Quantifier) & 게으른 수량자(Lazy Quantifier)


과하게 일치하는 상황 방지하기

RegEx: /<[Bb]>.*<\/[Bb]>

원하는 텍스트를 포함하긴 하지만, 찾으려 하지 않은 텍스트도 포함됐다. 그 이유는, 바로 별표(*)와 더하기(+) 같은 메타 문자가 탐욕적(greedy)이기 때문이다.

이는 가능한 한 가장 큰 덩어리를 찾으려 한다는 뜻이다. 이런 메타 문자는 찾으려는 텍스트를 앞에서부터 찾는 게 아니라, 텍스트 마지막에서 시작해서 거꾸로 찾는다. 의도적으로 수량자(quantifier)를 탐욕적으로 설계했기 때문이다.


하지만 만약 탐욕적 일치를 원하지 않는다면 어떻게 해야 할까? 

탐욕적 수량자를 게으른(lazy) 수량자로 바꾸면 된다. '게으른' 이라고 부르는 이유는 문자가 최소로 일치하기 때문이다. 게으른 수량자는 가존 수량자 뒤에 물음표(?) 를 붙여서 표현한다.

탐욕적 수량자에는 모두 각각 대응되는 게으른 수량자가 있다.


탐욕적 수량자와 게으른 수량자

 탐욕적 수량자

게으른 수량자 

 * 

 *? 

 + 

 +? 

 {n,} 

 {n,}? 



게으른 수량자를 이용

RegEx: /<[Bb]>.*?<\/[Bb]>

게으른 수량자인 *? 를 사용해 먼저 AK만 일치시켰고, 뒤이어 나머지도 찾아 두 부분을 따로 일치시켰다.



'Programming > RegEx' 카테고리의 다른 글

구간 지정  (0) 2013.05.12
반복 찾기(+, *) 와 '?' 메타 문자  (0) 2013.05.12
포직스(POSIX) 문자 클래스  (0) 2013.05.12
메타 문자 사용  (0) 2013.05.06
문자 집합으로 찾기  (0) 2013.05.06
Posted by scii
: