⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
83. 문자열 일부 가져오기 SubStr
마지막 수정일: 2023-12-21
위치를 지정하여 전체 문자열의 일부를 반환하는 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. 각 줄의 이름 앞에 호(號) 제거하기
[도산 안창호]와 같이 이름 앞에 붙는 일종의 별칭을 '호'라고 하죠? 이번 예제는 이 '호'가 모두 두 글자라고 가정하고, 인물 목록에서 '호'를 제거해보도록 하겠습니다.
1 context := "
2 (
3 도산 안창호
4 백범 김구
5 추사 김정희
6 율곡 이이
7 )"
8
9 splitedText := StrSplit(context, "`n", "`r")
10 Loop splitedText.Length
11 mergedText .= SubStr(splitedText[A_Index], 4) "`n"
12 MsgBox(mergedText)
너무 복잡해보인다고 걱정하지 마세요! 한 줄씩 따라가보겠습니다.
우선 1번 줄부터 7번 줄까지는 알려드리지 않은 테크닉이니 이 예제를 보고 배우시면 됩니다. 대입 연산자 우측에 따옴표를 열고, 그 아랫줄에 괄호를 연 후에, 또 그 아랫줄에 개행을 포함한 문자열을 쭉 적은 후 마지막 줄에 괄호와 따옴표를 닫아줍니다. 이렇게 하면 개행이 있는 문자열을 대입할 수 있습니다!
이전에 지나가듯 언급했던 '길이가 긴 문자열을 인수로 넣는 방법'과 유사한 것을 알 수 있습니다. 다만 형태가 좀 헷갈리므로 단단히 외우시는게 좋습니다.
본론으로 돌아와서, 9번 줄과 10번 줄은 이전 강의 예제와 동일합니다.
개행을 기준으로 문자열을 쪼개주었으므로 StrSplit
의 OmitChars로 `r
를 전달해준 모습도 볼 수 있습니다.
10번 줄에서 오늘 배운 SubStr
를 이용하여 각 배열 요소의 네 번째 글자부터의 문자열을 가져옵니다.
즉, 해당 줄에서 쓰인 SubStr
구문에 의해 도산 안창호라는 전체 문자열에서 '안'부터 끝까지('안창호')를 반환합니다
이후 누적 대입 연산자 .=
를 이용하여 다시 하나의 변수에 담아줍니다.
개행을 나타내는 `n
과 함께요!
이를 각 줄마다 반복합니다.
따라서 최종 출력되는 문자열은 아래와 같습니다.
안창호
김구
김정희
이이
호가 꼭 두 글자라는 법도 없기 때문에 실제로 위와 같은 작업을 SubStr
로 하기엔 무리가 따릅니다.
누군가의 호+이름이 '천방지축 신짱구'라면, 위의 코드론 '축 신짱구'라는 문자열이 구해집니다.
여러 변칙적인 상황을 모두 대응할 수 있는 문자열 가공 방법을 추후에 배울테니 일단은 이렇게 만족하고 넘어갑시다.