파싱이란 구문분석이라 해석할 수 있습니다. 어려운단어 말고 쉽게 말하면 보고싶은거만 보는 함수죠.
김수한무/거북이/두루미
삼천갑자 동방삭
위 자료를 left, right, mid, split, len, instr 파싱함수로 내가 보고 싶은 부분만 골라서 보는 프로그램을 만들어 보겠습니다.
폼은 이렇게 준비합니다. 텍스트박스 두개를 준비하되 multiline을 두개 다 true로 설정하고 좌에서 우로 각 커맨드 1,2,3,4번이 되겠습니다. 동방삭이 맞습니다. 오타로 동박삭이 되었네요.
left 함수로는 "김수한무"를 가져와 보겠습니다. left(문자열, 자리수) 와 같이 사용합니다.
Private Sub Command1_Click()
Text2.Text = Left(Text1.Text, 4)
End Sub
이렇게 하면 left 버튼을 눌렀을때 left 함수로 텍스트박스 1번에 담긴 문자열 중 왼쪽 가장자리에서 오른쪽으로 4번째되는 문자열까지 가져오게 됩니다. 이러면 결과는 당연히 "김수한무"가 되는겁니다.
right 함수로 "두루미"를 가져와 보겠습니다. 마찬가지로 right(문자열, 자리수) 와 같이 사용합니다.
Private Sub Command2_Click()
Text2.Text = Right(Text1.Text, 3)
End Sub
이렇게 하면 right 버튼을 눌렀을때 right 함수로 텍스트박스 1번에 담긴 문자열 중 오른쪽 가장자리에서 왼쪽으로 3번째되는 문자열까지 가져오게 됩니다. 이러면 결과는 당연히 두루미가 아니라 "동방삭"이 되죠. 엔터나 띄어쓰기를 구분하지 않고 문자열의 제일 오른쪽에서부터이므로, 두루미가 아니라 동방삭이 되는것입니다. 그렇기 때문에 두루미를 가져올 함수로는 right는 적당하지 않습니다. right 함수 하나로 두루미를 가져오는것은 불가능합니다.
mid 함수로 "거북이"를 가져와보겠습니다. 조금 다르게 시작점과 끝점을 지정할 수 있습니다. mid(문자열, 시작점, 끝점) 과 같이 사용합니다.
Private Sub Command3_Click()
Text2.Text = Mid(Text1.Text, 6, 3)
End Sub
이렇게 하면 mid 버튼을 눌렀을때 mid 함수로 텍스트박스 1번에 담긴 문자열 중 왼쪽 가장자리에서 6번째되는 문자열부터 다시 3번째되는 문자열까지 가져오게 됩니다. 이러면 결과는 당연히 김,수,한,무,/ 5개를 넘어서 6번째인 "거" 부터 다시 3번째인 "이"까지 가져오므로 "거북이"가 됩니다. 이 문자열에서 두루미를 가져오는 방법으로는 mid 함수가 적당하겠습니다.
split 함수로 "삼천갑자"를 가져와 보겠습니다. split 함수는 split(문자열, 구분자)(인덱스번호) 와 같이 사용합니다.
Private Sub Command4_Click()
Text2.Text = Split(Text1.Text, " ")(0)
End Sub
이렇게 하면 split 버튼을 눌렀을때 split 함수로 텍스트박스 1번에 담긴 문자열 중 구분자 띄어쓰기를 기준으로 인덱스 0번의 문자열을 가져오게 됩니다. 이러면 결과는 당연하지 않게 "김수한무/거북이/두루미" & vbcrlf & "삼천갑자"가 됩니다. right 함수에서 말씀드린것과 마찬가지로 엔터나 띄어쓰기를 구분짓지 않아서 생기는 당연한 결과입니다. 이 또한 mid 함수가 적당하겠습니다. 다만, 이중 함수로 Text2.Text = Split(Split(Text1.Text, " ")(0), vbCrLf)(1) 처럼 불러오면 "삼천갑자"를 가져올 수 있습니다.
Text2.Text = Split(Split(Text1.Text, " ")(0), vbCrLf)(1) 이중파싱 함수에 대한 설명
스플릿 함수로 삼천갑자와 동방삭 사이에 있는 띄어쓰기라는 구분자를 기준으로 인덱스번호 0번의 텍스트를 다시 스플릿 함수로 개행(줄내림) 이라는 구분자를 기준으로 인덱스번호 1번의 텍스트를 가져와 text2.text에 대입하는것입니다.
지금까지는 문자열을 길이만큼 가져오는 함수에 대해서 알았다면, len과 instr을 통해서 문자열의 길이와 위치를 알아보도록 하겠습니다. 위에서 사용한대로 문자열이 항상 고정되어있으면 상관없지만 항상 변하는 상황이라면 반드시 instr 함수를 알아야만 합니다. 길고 또 복잡해보일 수 있으나 찬찬히 읽어보시면 이해가 되시리라 믿고 써보도록 하겠습니다.
우선 예제 사진을 조금 추가/수정합니다. 3가지의 길이 가져오기 함수용 버튼을 만들고 이름을 넣습니다.
len은 문자열의 길이를 가져옵니다. len(문자열) 과 같이 사용하는데, "안녕하세요."라는 문자열의 길이는 6 입니다.
Private Sub Command5_Click()
Text2.Text = Len(Text1.Text)
End Sub
버튼을 눌러보면 17이라는 결과가 나옵니다. 이 len은 단순히 화면상에 떠있는 문자열의 길이를 구하기도 하지만, 파일을 불러올때 dir 함수를 곁들여 파일의 용량을 체크하기도 합니다.
instr은 위에서 설명한것처럼, 문자열을 찾아서 위치를 반환하는 함수입니다. instrrev라는 함수도 사용하는데, 같은 함수지만 방향이 다른 함수입니다.
instr(시작지점, 탐색범위, 탐색문자열, 옵션) 또는 instr(탐색범위, 탐색문자열, 시작지점, 옵션)과 같이 사용합니다.
Private Sub Command6_Click()
Text2.Text = InStr(Text1.Text, "연")
End Sub
텍스트박스 1번에 대입한 "연말연시 각종 안전사고 주의요망" 문자열에서 "연"이라는 문자열의 위치를 가져옵니다. 결과값은 1인데, 설명하자면 이렇습니다.
"연말연시 각종 안전사고 주의요망"에서 "연"은 두 번 들어갑니다. instr 함수는 탐색범위 왼쪽 가장자리에서 오른쪽으로 탐색문자열이 탐색되는 첫번째 위치를 반환하기 때문입니다. 연시로 가기전에 연말에서 이미 만났으므로 1을 반환하고 종료되는것이죠. "연"이 아니라 "연시"였다면 결과는 3이 됩니다.
Private Sub Command7_Click()
Text2.Text = InStrRev(Text1.Text, "연")
End Sub
텍스트박스 1번에 대입한 "연말연시 각종 안전사고 주의요망" 문자열에서 "연"이라는 문자열의 위치를 가져옵니다. 결과값은 3인데, 설명하자면 이렇습니다.
마찬가지로 두 번 들어가는 연입니다. 이번에는 왼쪽이 아니라 오른쪽 가장자리로부터 왼쪽으로 탐색문자열이 탐색되는 첫번째 위치를 왼쪽에서 오른쪽으로 보는 순서에 의해 반환하기 때문입니다.
Text2.Text = InStr(2, Text1.Text, "연") 이라면, "연말연시 각종 안전사고 주의요망" 결과값은 3이 됩니다.
탐색범위(text1.text) 중 왼쪽 가장자리에서 오른쪽으로 몇번째(2)를 기준삼아 다시 오른쪽으로 탐색문자열을 찾아 반환된 값을 대입합니다.
Text2.Text = InStrRev(Text1.Text, "연", 2) 이라면, "연말연시 각종 안전사고 주의요망" 결과값은 1이됩니다.
탐색범위(text1.text) 중 왼쪽 가장자리에서 오른쪽으로 몇번째(2)를 기준삼아 반대로 왼쪽으로 탐색문자열을 찾아 반환된 값을 대입합니다.
이렇게 파싱에 대해서 알아봤습니다.