프날 오토핫키 강좌  v2

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

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

89. RegExMatch


배운 패턴을 이용하여 오토핫키에서 정규식을 이용한 고급 파싱 작업을 수행할 수 있습니다.

이번 강에 들어가기에 앞서, 정규식의 두 가지 주요 기능은 "검색"과 "치환"이라는 점, 다시 한 번 짚고 가겠습니다.

RegExMatch

RegExMatch는 오토핫키에서 정규식을 이용한 검색을 하는 함수입니다. RegEx는 정규식(Regular Expression), Match는 매치되는 부분을 검색한다는 점을 의미합니다.

RegExMatch(Haystack, NeedleRegEx [, &OutputVar, StartingPos])
RegExMatch 함수의 원형

매개변수

  • Haystack: 전체 문자열입니다.
  • NeedleRegEx: 검색할 정규식 패턴입니다.
  • &OutputVar: 패턴의 부패턴과 일치하는 부분을 저장할 참조입니다.
  • StartingPos: 검색을 시작할 위치입니다.

반환값

가장 첫번째로 매칭된 위치를 정수로 반환합니다.

Haystack은 파싱할 전체 문자열을 넣으면 되니 생략하고, NeedleRegEx는 지난번 배운 패턴을 적어주시면 됩니다. 패턴은 문자열이므로 당연히 "따옴표" 처리를 해주어야합니다. 이제 89강까지 왔는데, 이 점은 당연히 아셨겠죠?

패턴의 부패턴과 일치되는 부분이 있다면 &OutputVar에 지정한 변수에 매칭된 부분이 객체 형태로 담깁니다. 패턴 내에 부패턴이 두 개 쓰였으면, OutputVar[1]OutputVar[2]로 각 일치하는 부분을 가져올 수 있으며, OutputVar.Count로 일치하는 부분의 개수, OutputVar.Len[1]로 해당 부패턴과 매칭된 부분의 길이, OutputVar.Pos[1]로 해당 부패턴의 일치된 위치를 가져올 수도 있습니다.

마지막으로 StartingPos는 지금까지 문자열 파싱 함수에서 써왔던 것처럼 검색 시작 위치를 의미하며, 음수 n을 넣으면 '끝에서 n번째'부터 탐색을 시작합니다.

실습

정규식은 연습 또 연습! 경험만이 실력을 늘릴 수 있습니다.

1. 두 문자열 사이에 있는 임의의 문자열과 그 위치 가져오기

"서울-00차-0000" 에서 '00차'와 그 위치를 가져오기.
단, '서울', '00차', '0000'은 상황에 따라 바뀔 수 있고, '-'만 변함이 없음.

위와 같은 상황에서 '00차' 부분의 문자열과 그 위치를 가져오려면, 정규식을 이용할 수 있습니다. 왜 SubStr을 사용하지 못하냐면 앞에 '서울'이 세 글자의 다른 지역으로 바뀔수 있기 때문입니다. (다만 StrSplit을 쓰면 되긴 합니다.)

1haystack := "서울-00차-0000"
2subPat := {}
3stringPos := RegExMatch(haystack, "-(.*)-", &subPat)
4MsgBox("위치: " subPat.Pos[1] "`n문자열: " subPat[1])
예제 1. 두 문자열(-) 사이에 있는 임의의 문자열과 그 위치 가져오기

한번 '서울', '00차', '0000'을 임의의 문자열로 바꿔보세요. '00차' 부분의 문자열과 위치를 가져올 것입니다.

위의 예제에서 패턴은 -(.*)-을 썼는데, 부패턴을 사용한 것이 특징입니다. RegExMatch의 &OutputVar 매개변수를 제대로 이용하려면 위와 같이 부패턴을 지정해준 후, outputVar[1]과 같이 '첫 번째 부패턴에 매칭되는 부분'을 명시하여 적어주어야 합니다. 따라서 부패턴을 Dot-star 패턴을 넣어 사용해주었습니다. 위의 패턴은 결국 두 - 사이에 있는 아무 문자 전부와 매칭되겠네요.

그 외에, 2번 줄에 빈 객체 리터럴로 subPat 변수를 만들어주었는데, 사실 빈 문자열("")이나 심지어 정수(0)로 변수를 만들어줘도 RegExMatch에 쓰이면서 자동으로 객체가 담기므로 별 상관은 없습니다. 다만 객체가 담길 변수이므로 빈 객체를 담아서 만들어주는 것이 자연스러우므로 위와 같이 해주었습니다.

기초 강좌이므로 이보다 더 심화적인 정규식을 다루진 않을 것입니다. 이정도만 이해하면 실무에서 절반 정도의 케이스는 대응할 수 있으니, 일단은 이렇게 알아두고 다음 강으로 넘어갑시다.

질문하러 가기