⚠ 이 강좌는 오토핫키 v1을 다룹니다
지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.
[프날 오토핫키] 정규표현식(정규식) (상)
정규식에 관해선 강좌 본편에서 다룬 적이 있습니다. 다만 원리와 개념 다 건너 뛰고, "이렇게 쓰면 됩니다" 식으로 알려드려서 언젠가 꼭 상세히 설명을 드리고 싶었는데, 드디어 관련 내용을 써 보네요.
이번 강에서는 정규표현식에 관한 간단한 설명을 드릴겁니다. 저도 정규식을 잘 쓰는 편이 아니고, 그냥 딱 기초만 설명드릴려고 합니다. (물론 그러다보니 일부 내용들밖에 알려드리지 못하네요.)
본 포스팅은 오토핫키 정규식을 다룹니다. (정규식이 종류가 여러가지라서, 검색으로 유입된 분들 중 오토핫키가 아닌 분들은 돌아가주시면 됩니다.)
정규식이란?
문자열을 가공하여 유의미한 정보를 가져오는 과정을 "파싱"이라고 합니다. 이러한 파싱을 위해 오토핫키에서는 SubStr(), StrLen(), InStr() 등의 파싱 함수를 제공하고, 실제로 이러한 함수들만으로도 충분히 원하시는 파싱 작업을 할 수 있습니다.
그러나 이러한 함수를 사용하면, 하려는 작업에 따라 소스코드가 여러 줄로 늘어나기 쉽우며 복잡해집니다. 결국은 생산성을 떨어뜨리는 일이지요. 그래서 더욱 간결하고 짧은 코드로 파싱 작업을 하기 위해 정규식이 탄생했습니다.
정규식은 정규 표현식의 줄임말이며, 말 그대로 "약속된 체계에 따라서" 문자열을 가공할 수 있는 일종의 수단입니다.
위 그림과 같이, 우리는 정규 표현식을 이용하여 문자열을 가공해볼 것입니다.
RegExMatch()와 RegExReplace()
정규식의 주된 목적은 "검색"과 "치환"이라고 합니다. 오토핫키에선 이 둘을 위해서 각각 RegExMatch()함수와 RegExReplace()함수를 제공하고있습니다.
- RegExMatch(): 특정 패턴을 [검색]하여, 해당 패턴을 찾은 위치를 반환
- RegExRaplace(): 특정 패턴을 [치환]하여, 치환된후의 문자열을 반환
말이 조금 어렵습니다. 패턴에 대해선 추후 설명드리도록 하고, 우선 간단하게 하는 작업의 차이를 느껴보겠습니다.
예를 들어서, "abc123"이라는 문자열이 있다고 합시다. 여기서 "123"이라는 문자열은 처음부터 따졌을 때 4번째 글자부터 시작합니다. RegExMatch()를 이용하여 "abc123"에서 123"을 찾으라고 써주면, 4를 반환한다는 뜻이죠.
반면 RegExReplace()는 치환이라고 했습니다. "abc123"에서 "123을 가나다로 치환해라"라는 작업을 할 수 있지요. 해당 작업 후엔 RegExReplace()는 "abc가나다"를 반환합니다.
즉, 검색은 RegExMatch(), 치환은 RegExReplace()를 쓰면 됩니다.
패턴
위에서 "패턴"이라는 말이 살짝 나왔습니다. 패턴은 특정 문자를 이용하여 다른 문자를 표현해주는 방식입니다.
예를 들어서, "0, 1, 2, 3, 4, 5, 6, 7, 8, 9"를 ★이라고 약속해보겠습니다. 그리고 아까의 RegExMatch()를 이용하여 "abc123"에서 "123"의 위치를 찾는 예시를 변형해보겠습니다.
이번에도 역시 "abcOOO"의 문자열에서 OOO부분의 위치를 찾고자합니다. OOO에는 임의의 정수 세 자리가 올 수 있습니다. 기존에 쓰던대로 ["123"을 찾아라]라고 했을 때, 123이 아닌 다른 숫자가 오면 안될 것입니다. 그럴 땐, 아까 약속했던 것과 같이 ["★★★을 찾아라"]와 같이 쓸 수 있는 것이지요.
이러한 "패턴에 사용하는 기호"는 오토핫키에서 정해두었습니다. 물론 ★와 같이 어려운 특수기호 말고, 키보드 자판에 써 있는 기호만을 취급합니다.
"문자열"에서 "패턴"을 찾는 과정이 정규식의 핵심입니다. 패턴이 문자열과 일치할 때를 "매칭했다"와 같이 부르도록 하겠습니다. (예: abc123이라는 문자열 중 123과 ★★★이 매칭됩니다.)
패턴은 우리가 보통 쓰는 자연어가 아니기때문에, 복잡합니다. 그래서 패턴의 종류는 다음 편에서 설명드리도록 하겠습니다.