⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
82. 문자열 쪼개기 StrSplit
마지막 수정일: 2024-06-08
이번 강에서는 전체 문자열을 쪼개서 배열로 만들어주는 StrSplit
함수를 배워보겠습니다.
StrSplit
StrSplit
함수는 전체 문자열을 하나의 단일 문자를 기준으로 분할하여, 각 분할된 부분을 요소로 하는 배열을 반환하는 역할을 합니다.
StrSplit(String [, Delimiters, OmitChars, MaxParts])
StrSplit 함수의 원형
- String: 전체 문자열(가공할 문자열)입니다.
- Delimiters: 쪼갤 기준이 될 '구분자'입니다. 여러 문자를 지정 가능합니다.
- OmitChars: 배열 요소의 양 끝에서 제외할 문자입니다. 여러 문자를 지정 가능합니다.
- MaxParts: 최대로 분할할 개수입니다.
어렵지 않습니다.
기본적으로 String에 전달된 문자열을, Delimiters에 적은 문자를 기준으로 분할하여 반환한다고 생각하시면 됩니다.
단, Delimiters를 생략하면 한 글자씩 쪼개서 배열로 만들어줍니다.
그리고 단일 문자가 아닌 여러 문자열이 담긴 배열을 전달하여 각 문자열을 모두 구분자로 쓸 수 있습니다.
예를 들어서 [1, 2]
를 Delimiters로 전달하면 1
에서도, 2
에서도 분할됩니다.
OmitChars는 배열 요소의 양 끝에서 제거할 문자며, 예를 들어서 분할된 문자열의 끝에서 개행을 제거하고 싶다면 `n
을 적어주시면 됩니다.
참고로, Delimiters가 `n
을 기준으로 분할할 땐 `r
을 OmitChars에 적어주세요.
이유는 후술하겠지만 강좌와 조금 동떨어진 내용이기 때문에 Tip 상자에 적겠습니다.
MaxParts는 분할된 요소의 개수 최대치를 정해줍니다. 즉 2
를 적으면 반환 배열은 최대 두 개의 요소를 가지게 됩니다.
분할되지 않고 남은 문자열은 배열의 마지막 요소에 한번에 들어가게 됩니다.
Tip: 개행을 구분자로 쓸 때 `r
을 OmitChars로 전달해야 하는 이유?
여러분이 쓰고 계시는 Windows 운영체제는 줄바꿈을 `r`n
으로 표현합니다.
`r
은 CR(Carriage Return), `n
은 LF(Line feed)라고 부릅니다.
두 문자를 써야 비로소 줄바꿈 하나를 표현할 수 있는 것입니다.
이는 자판의 원조인 '타자기'부터 내려오는 역사 때문인데, 그 시절엔 새 줄을 시작하려면 '입력 위치를 종이의 맨 처음으로 가져오는 동작'과 '입력 위치를 다음 줄로 내려주는 동작'을 했기 때문입니다. 횡으로 처음 위치로 옮기고, 종으로 다음 줄로 내리는 것이죠.
이것이 유산으로 남아 Windows에서는 CR+LF를 하나의 줄바꿈으로 이용하게 되어서, 각종 텍스트 파일을 CR+LF를 줄 끝으로 하여 저장하게 됩니다.
그러나 대부분의 상황에선 LF(`n
)만 써도 정상적으로 보이기 때문에 MsgBox
등에 출력해줄 땐 `n
만 넣어서 개행을 해준 것입니다.
문제는 StrSplit
및 관련 함수는 String 매개변수에 오는 문자열이 보통은 그때 그때 다르다는 점입니다.
입력으로 주어진 문자열의 줄 끝이 `n
일지, `r`n
일지는 상황에 따라 다릅니다.
프로그래밍에서 문자열을 줄 단위로 다룰 때 `r
을 고려하지 않으면 원하는 대로 동작하지 않을 수 있습니다.
`r
은 기본적으로 눈에 보이지 않는 문자이기 때문에 이것이 남아있을 경우 디버깅에 꽤 많은 수고를 들이게될 수도 있고요.
이것이 StrSplit
의 OmitChars 매개변수로 `r
을 전달해주는 이유입니다!
문자열을 `n
으로 분할할 때 `r
을 선제적으로 제거해주지 않으면, 남아있는 이 문자 때문에 향후 문자열 가공이 제대로 되지 않는 등의 문제가 생길 수 있습니다.
실습
1. 어절 단위로 분할하여 출력하기
주어진 문자열을 어절 단위로 분할하여(=공백을 기준으로 분할하여) 배열에 담은 후, 각각 MsgBox
로 출력해봅시다.
1 context := "국가는 평생 교육을 진흥하여야 한다!"
2 splitedText := StrSplit(context, " ")
3 Loop splitedText.Length
4 MsgBox(splitedText[A_Index])
하나씩 살펴보면 어렵지 않을 것입니다.
오늘 배운 부분은 2번 줄에 있는데요, 분리할 문자열은 context
변수로, 구분자는 띄어쓰기로 해주었네요.
그 밑은 그냥 배열을 순회하며 하나씩 출력하는 것 뿐입니다.
2. 줄바꿈 단위로 분할하여 출력하기
1 context := "모든 국민은 평생에 걸쳐 학습하고`n능력과 적성에 따라 교육받을 권리를 가진다"
2 splitedText := StrSplit(context, "`n", "`r")
3 Loop splitedText.Length
4 MsgBox(splitedText[A_Index])
예제 1과 거의 똑같은 구조입니다.
차이점이 있다면 개행을 구분자로 삼았다는 것과, 본문에서 강조했다싶이 개행을 구분자로 삼았기 때문에 `r
을 OmitChars로 전달해 주었다는 것이죠.
이 예제의 context는 개행으로 `n
만 사용했지만, 실제 상황에서는 `r`n
로 줄 구분이 되어있는 경우가 더 많습니다.
따라서 위와 같이 항상! Delimiters가 `n
면 OmitChars는 `r
로 적어주는 습관을 들여야합니다.