⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
91. 정규식 이모저모
마지막 수정일: 2023-12-17
정규식을 배우느라 수고 많으셨습니다. 미처 이야기하지 못한, 정규식에 관한 여담 몇 가지를 말씀드리도록 하겠습니다. 아래와 같은 내용은 꼭 알지 않아도 좋으나, 언젠간 알아야 하는 내용이므로 정규식 사용이 조금 익숙해졌다면 다시 와서 봐주시면 감사하겠습니다.
탐욕과 게으름
오토핫키 정규식은 탐욕스럽습니다!
무슨 뜻이냐면, <em>AHK</em>라는 문자열에서 <.*>
패턴은 아래와 같이 두 부분으로 매칭된다고 생각할 수 있는데,
오토핫키 정규식에선 1번과 같이 더 많은 양을 한번에 매칭합니다.
1. <em>AHK</em>
2. <em>AHK</em>
1번과 같이 가능한 한 많은 양을 한번에 매칭하는 방법을 '탐욕적이다'라고 하며, 반대로 2번과 같이 최대한 적은 부분을 매칭하는 방법은 '게으르다'라고 합니다. 오토핫키 정규식은 탐욕적이기 때문에, 때론 원치 않는 부분까지 매칭될 수 있습니다.
이 경우 <.*?>
같이 탐욕적 패턴(.*
)에 물음표 패턴 문자(?
)을 붙여주면 '게으르게' 탐색할 수 있습니다.
수량자
*
, +
, ?
와 같이 선행자의 수량을 정해주는 패턴 문자를 '수량자'라고 하는데, 기본적으로 이 수량자가 수량을 셀 때 탐욕적이기 때문에 이러한 성질이 나타나게 됩니다.
따라서 이들을 '탐욕적 수량자'라고 합니다.
반댓말은 '게으른 수량자'겠죠.
옵션
Haystack이 여러 줄일 때, 아무리 탐욕적인 정규식이라도 딱 한 줄까지만 매칭됩니다. 그러나 모든 줄을 한번에 매칭하고자 한다면 정규식에 옵션을 지정해주어야 하는데, 이렇게 정규식에 쓸 수 있는 옵션이 많습니다.
옵션은 옵션)패턴
처럼 패턴 앞에 닫는 괄호()
)로 구분하여 적어주고, 정규식이 늘 그랬듯 Case-sensitive, 대소문자를 구분합니다.
옵션은 정말 많은데 쉬운 옵션 딱 세 개만 적도록 하겠습니다.
더욱 많은 패턴을 싶다면 오토핫키 공식 문서의 RegEx: Quick Reference 문서를 참고하세요.
옵션 | 설명 |
---|---|
i | 대소문자 구분 해제 |
m | 여러 줄 매칭 |
U | 기본적으로 게으르게 탐색 |
여러 옵션은 im)패턴
처럼 이어서 쓰면 됩니다.
속도에 관해
일반적인 파싱 함수 한 번으로 끝낼 수 있는 작업은 그렇게 하는 것이 좋습니다.
정규식은 더욱 복잡한 작업을 수행하는 만큼 속도도 더 느립니다.
그것이 단발성, 혹은 적은 문자열에 수행하면 별 차이가 없지만, 반복적으로 파싱하거나 크기가 큰 문자열을 파싱할 경우 RegExReplace
대신 StrReplace
를 쓰는 등의 노력이 필요합니다.
다만 읽기 쉬운 코드가 좋은 코드인 법, 몇 줄씩 늘여서 SubStr
, InStr
, StrSplit
, StrReplace
등을 사용하는 것보단, 한 줄로 정규식을 써서 해결하는 것이 더 아름다울 때가 많습니다.
상황에 따라, 또 필요한 성능에 따라 코드 가독성과 적절히 저울질하여 적당한 방법을 선택하는 요령을 길러봅시다.