프날 오토핫키 강좌  v2

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

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

83. 문자열 일부 가져오기 SubStr


위치를 지정하여 전체 문자열의 일부를 반환하는 SubStr 함수를 배워보겠습니다.

SubStr

SubStr 함수는 원본 문자열을 주어진 위치부터 주어진 길이만큼 반환하는 함수입니다.

SubStr(String , StartingPos [, Length])
SubStr 함수의 원형
  • String: 전체 문자열입니다.
  • StartingPos: 가져올 문자열의 시작 위치입니다.
  • Length: 가져올 길이입니다.

지난 강의 StrSplit보다 훨씬 쉽습니다! 그냥 StartingPos부터 Length만큼의 문자열을 반환하는 함수일 뿐입니다. 좀 더 자세히 들어가겠습니다. 우선 Length 매개변수를 생략하면 StartingPos부터 문자열의 끝까지를 가져옵니다. 이건 쉽죠?

또 StartingPos와 Length 매개변수는 음수가 올 수 있는데, 이 경우 문자열의 '뒤에서 n번째'를 의미합니다. 이 '뒤에서 n번째' 개념은 InStr에서도 설명한 바 있습니다. 예를 들어서 StartingPos에 -7이 전달되면 '뒤에서 7번째'를 시작 위치로 삼습니다. 또, Length에 -5가 전달되면 문자열의 '뒤에서 5개'의 문자를 제외하고 반환합니다.

쉽게 알아보죠. 아래와 같은 문자열이 있습니다.

국가는 평생 교육을 진흥하여야 한다.

1. StartingPos로 5를 전달하고, Length에 아무것도 적지 않으면 평생 교육을 진흥하여야 한다.를 반환합니다. 5번째 글자는 '평'이고, 상술했듯 Length를 생략하면 문자열의 끝까지 가져오기 때문입니다. '국가는' 다음에 오는 띄어쓰기 역시 하나의 문자임을 유의하세요.

2. StartingPos로 -9를 전달하고, 역시 Length에 아무것도 적지 않으면 진흥하여야 한다.를 반환합니다. 뒤에서 5번째 문자부터 가져오기 때문입니다. 마침표(.)도 엄연한 하나의 문자임을 유의하세요.

3. StartingPos로 5를 전달하고, Length에 5를 전달하면 평생 교육을 반환합니다. 4번째 글자부터 5개의 문자를 가져오기 때문입니다. 역시 공백 또한 하나의 문자임을 유의하세요.

4. 마지막으로, StartingPos로 5를 전달하고, Length에 -3을 전달하면 평생 교육을 진흥하여야 를 반환합니다. 4번째 글자부터 뒤에서 세 글자(한다.)를 제외하고 반환하기 때문입니다.

문제 없겠죠? 마우스 커서로 문자를 하나씩 짚어보며 파악해보세요.

실습

1. 각 줄의 이름 앞에 호(號) 제거하기

[도산 안창호]와 같이 이름 앞에 붙는 일종의 별칭을 '호'라고 하죠? 이번 예제는 이 '호'가 모두 두 글자라고 가정하고, 인물 목록에서 '호'를 제거해보도록 하겠습니다.

1context := "
2(
3도산 안창호
4백범 김구
5추사 김정희
6율곡 이이
7)"
8
9splitedText := StrSplit(context, "`n", "`r")
10Loop splitedText.Length
11    mergedText .= SubStr(splitedText[A_Index], 4) "`n"
12MsgBox(mergedText)
예제 1. 각 행의 첫 세 글자 제거

너무 복잡해보인다고 걱정하지 마세요! 한 줄씩 따라가보겠습니다.

우선 1번 줄부터 7번 줄까지는 알려드리지 않은 테크닉이니 이 예제를 보고 배우시면 됩니다. 대입 연산자 우측에 따옴표를 열고, 그 아랫줄에 괄호를 연 후에, 또 그 아랫줄에 개행을 포함한 문자열을 쭉 적은 후 마지막 줄에 괄호와 따옴표를 닫아줍니다. 이렇게 하면 개행이 있는 문자열을 대입할 수 있습니다!

이전에 지나가듯 언급했던 '길이가 긴 문자열을 인수로 넣는 방법'과 유사한 것을 알 수 있습니다. 다만 형태가 좀 헷갈리므로 단단히 외우시는게 좋습니다.

본론으로 돌아와서, 9번 줄과 10번 줄은 이전 강의 예제와 동일합니다. 개행을 기준으로 문자열을 쪼개주었으므로 StrSplit의 OmitChars로 `r를 전달해준 모습도 볼 수 있습니다.

10번 줄에서 오늘 배운 SubStr를 이용하여 각 배열 요소의 네 번째 글자부터의 문자열을 가져옵니다. 즉, 해당 줄에서 쓰인 SubStr 구문에 의해 도산 안창호라는 전체 문자열에서 '안'부터 끝까지('안창호')를 반환합니다 이후 누적 대입 연산자 .=를 이용하여 다시 하나의 변수에 담아줍니다. 개행을 나타내는 `n과 함께요! 이를 각 줄마다 반복합니다.

따라서 최종 출력되는 문자열은 아래와 같습니다.

안창호
김구
김정희
이이

호가 꼭 두 글자라는 법도 없기 때문에 실제로 위와 같은 작업을 SubStr로 하기엔 무리가 따릅니다. 누군가의 호+이름이 '천방지축 신짱구'라면, 위의 코드론 '축 신짱구'라는 문자열이 구해집니다. 여러 변칙적인 상황을 모두 대응할 수 있는 문자열 가공 방법을 추후에 배울테니 일단은 이렇게 만족하고 넘어갑시다.

질문하러 가기