5. 반복 찾기 - 손에 잡히는 10분 정규 표현식 |
* 몇 번 일치하는가?
** 하나 이상의 문자 찾기
-
문자나 집합에 속한 요소를 하나 이상 찾으려면 간단히 문자 뒤에 더하기(+) 문자를 붙이면 된다.
문자가 하나 이상일 때 일치한다.
-
집합 문자에 + 를 사용할 때는, 더하기를 집합 바깥에 두어야 한다.
-
더하기(+)는 메타 문자다.
문자 그대로 더하기를 찾으려면 \+ 로 이스케이프 해야 한다.
-
일반적으로 마침표(.)나 더하기(+) 같은 메타 문자들이 집합의 구성원일 때는 문자 그대로 취급되므로 굳이 이스케이프 할 필요가 없다.
그러나 이스케이프 한다고 문제가 생기지는 않는다.
[\w.] 는 [\w\.] 과 같다.
** 문자가 없거나 하나 이상 연속하는 문자 찾기
-
별표(*)를 사용하면 된다.
** 문자가 없거나 하나인 문자 찾기
-
물음표(?) 를 사용하면 된다.
* 구간 지정하기
-
더하기, 별표, 물음표는 정규식을 쓰면서 발생하는 많은 문제를 해결해 주지만, 충분하지 않을 때도 있다.
더하기, 별표는 일치하는 문자 수에 제한이 없고, 일치하는 문자 수의 최소값도 명시할 수 없다.
또한 정확히 원하는 만큼만 일치하도록 문자 수를 정의할 수도 없다.
-
연속하는 문자를 찾을 때 검색 조건을 더 구체적으로 지정하고자 정규식에는 구간(interval)을 사용한다.
구간은 중괄호( {} ) 안에 표시한다.
** 정확한 구간 찾기
-
문자가 일치하는 수를 정확히 정하려면 여는 중괄호와 닫는 중괄호 사이에 숫자를 넣는다.
{3} 은 바로 앞에 있는 문자나 문자 집합이 세 번 연속해서 일치하는지 확인한다.
** 범위 구간 찾기
-
값(일치 횟수)의 범위, 다시 말해 일치시키려는 요소(instance) 수의 최솟값과 최댓값을 나타낼 때도 구간을 사용한다.
범위는 {2,4} 처럼 표현한다.
최소 두번에서 최대 네번까지 일치시킨다는 의미이다.
날짜 형식을 찾는 정규식이 범위 구간(range interval) 찾기를 보여 주는 에로 적절하다.
-
구간은 0부터 시작하기도 한다.
{0,3} 은 요소가 없는 경우나 요소가 한번 또는 두번 또는 세번 일치함을 의미한다.
** ‘최소’ 구간 찾기
-
구간 검색은 최댓값 없이 찾고자 하는 요소의 최솟값을 지정할 수도 있다.
{3,} 은 최소한 요소가 세 번 일치함을 의미한다.
-
최솟값으로 구간을 찾을 때는 주의해야 한다.
만약 쉼표(,)가 빠지면 찾으려는 요소의 최솟값이 아니라 정확히 지정한 만큼 일치시키는 것으로 인식한다.
* 과하게 일치하는 상황 방지하기
-
별표(*)와 더하기(+) 같은 메타 문자가 탐욕적(greedy)이므로 이는 가능한 한 가장 큰 덩어리를 찾으려 한다.
이런 문자는 찾으려는 텍스트를 앞에서부터 찾는 게 아니라, 텍스트 마지막에서 시작해 거꾸로 찾는다.
의도적으로 수량자(quantifier)를 탐욕적으로 설계했기 때문이다.
(돼왕 : greedy 와 lazy 의 search 방식에 대한 그림으로의 이해 )
-
<b>AK</b> and <b>HI</b>
위 문자들에 대해 <[Bb]>.*<\/[Bb]> 정규식을 적용하면 이는 두번 매칭이 아니라 모든 문자에 대해 한번 매칭시킨다.
( 아마 원래 의도는 .* 에 AK 와 HI 이렇게 두 번 매치시키고 싶었을 것이다. )
-
탐욕적 수량자를 게으른(lazy) 수량자로 바꾸어주는 것이 좋다.
‘게으른’이라고 부르는 이유는 문자가 최소로 일치하기 때문이다.
게으른 수량자는 기존 수량자 뒤에 물음표(?)를 붙여서 표현한다.
* -> *?
+ -> +?
{n, } -> {n, }?
* 요약
-
정규식 패턴이 지닌 진짜 능력은 반복 찾기를 할 때 뚜렷하게 나타난다.
더하기(+)(하나 이상 일치), 별표(*)(없거나 하나 이상 있는 경우 일치), 물음표(?)(없거나 하나인 경우 일치)로 반복 찾기를 수행했다.
검색 조건을 더 구체적으로 지정하려면 구간으로 정확한 반복 횟수나 최솟값, 최댓값을 정한다.
이 수량자들은 탐욕적이어서 너무 넓은 범위와 일치할 수도 있다.
이를 방지하려면 게으른 수량자를 사용한다.
'프로그래밍 놀이터 > Tips' 카테고리의 다른 글
[도서 정리] 7. 하위 표현식 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.29 |
---|---|
[도서 정리] 6. 위치 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.28 |
[도서 정리] 4. 메타 문자 사용하기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.26 |
[도서 정리] 3. 문자 집합으로 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.25 |
[도서 정리] 2. 문자 하나 찾기 - 손에 잡히는 10분 정규 표현식 (0) | 2019.12.24 |
댓글