프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

91. 정규식 이모저모


정규식을 배우느라 수고 많으셨습니다. 미처 이야기하지 못한, 정규식에 관한 여담 몇 가지를 말씀드리도록 하겠습니다. 아래와 같은 내용은 꼭 알지 않아도 좋으나, 언젠간 알아야 하는 내용이므로 정규식 사용이 조금 익숙해졌다면 다시 와서 봐주시면 감사하겠습니다.

탐욕과 게으름

오토핫키 정규식은 탐욕스럽습니다! 무슨 뜻이냐면, <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 등을 사용하는 것보단, 한 줄로 정규식을 써서 해결하는 것이 더 아름다울 때가 많습니다. 상황에 따라, 또 필요한 성능에 따라 코드 가독성과 적절히 저울질하여 적당한 방법을 선택하는 요령을 길러봅시다.

질문하러 가기