본문 바로가기
프로그래밍 놀이터/Tips

[도서 정리] 5. 반복 찾기 - 손에 잡히는 10분 정규 표현식

by 돼지왕 왕돼지 2019. 12. 27.
반응형

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, }?





* 요약


-

정규식 패턴이 지닌 진짜 능력은 반복 찾기를 할 때 뚜렷하게 나타난다.

더하기(+)(하나 이상 일치), 별표(*)(없거나 하나 이상 있는 경우 일치), 물음표(?)(없거나 하나인 경우 일치)로 반복 찾기를 수행했다.

검색 조건을 더 구체적으로 지정하려면 구간으로 정확한 반복 횟수나 최솟값, 최댓값을 정한다.

이 수량자들은 탐욕적이어서 너무 넓은 범위와 일치할 수도 있다.

이를 방지하려면 게으른 수량자를 사용한다.




반응형

댓글