문자열 처리하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

문자열 조작하기

다음은 strings 패키지에서 제공하는 문자열 조작 함수입니다.

  • func Join(a []string, sep string) string: 문자열 슬라이스에 저장된 문자열을 모두 연결
  • func Split(s, sep string) []string: 지정된 문자열을 기준으로 문자열을 쪼개어 문자열 슬라이스로 저장
  • func Fields(s string) []string: 공백을 기존으로 문자열을 쪼개어 문자열 슬라이스로 저장
  • func FieldsFunc(s string, f func(rune) bool) []string: 유니코드 검사 함수를 정의한 뒤 특정 유니코드 값을 기준으로 문자열을 쪼개어 문자열 슬라이스로 저장
  • func Repeat(s string, count int) string: 문자열을 특정 횟수만큼 반복
  • func Replace(s, old, new string, n int) string: 문자열에서 특정 문자열을 바꿈
  • func Trim(s string, cutset string) string: 문자열 앞 뒤에 있는 특정 문자열 제거
  • func TrimLeft(s string, cutset string) string: 문자열 앞에 오는 특정 문자열 제거
  • func TrimRight(s string, cutset string) string: 문자열 뒤에 오는 특정 문자열 제거
  • func TrimFunc(s string, f func(rune) bool) string: 문자열 정리 함수를 정의하여 문자열 제거
  • func TrimLeftFunc(s string, f func(rune) bool) string: 문자열 정리 함수를 정의하여 문자열 앞에 오는 특정 문자열 제거
  • func TrimRightFunc(s string, f func(rune) bool) string: 문자열 정리 함수를 정의하여 문자열 뒤에오는 특정 문자열 제거
  • func TrimSpace(s string) string: 문자열 앞뒤에오는 공백 문자 제거
  • func TrimSuffix(s, suffix string) string: 접미사 제거
  • func NewReplacer(oldnew …string) *Replacer: 문자열 교체 인스턴스를 생성
  • func (r *Replacer) Replace(s string) string: 문자열 교체 인스턴스를 사용하여 문자열을 교체

이번에는 문자열을 연결하고, 쪼개고, 반복하고, 바꾸는 방법을 알아보겠습니다.

package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	s1 := []string{"Hello,", "world!"}
	fmt.Println(strings.Join(s1, " ")) // Hello, world!

	s2 := strings.Split("Hello, world!", " ")
	fmt.Println(s2[1]) // world!

	s3 := strings.Fields("Hello, world!")
	fmt.Println(s3[1]) // world!

	f := func(r rune) bool {
		return unicode.Is(unicode.Hangul, r) // r이 한글 유니코드이면 true를 리턴
	}
	s4 := strings.FieldsFunc("Hello안녕Hello", f)
	fmt.Println(s4) // [Hello Hello]

	fmt.Println(strings.Repeat("Hello", 2)) // HelloHello

	fmt.Println(strings.Replace("Hello, world!", "world", "Go", 1)) // Hello, Go!
	fmt.Println(strings.Replace("Hello Hello", "llo", "Go", 2))     // HeGo HeGo
}
  • strings.Join 함수는 문자열 슬라이스에 저장된 문자열을 모두 연결합니다. 여기서 두 번째 매개변수는 문자열을 연결할 때 사이에 끼워넣을 문자열입니다.
  • strings.Split 함수는 지정된 문자열을 기준으로 문자열을 쪼개어 문자열 슬라이스로 저장합니다. 예제에서는 “ “ (공백)을 기준으로 문자열을 쪼갭니다.
  • strings.Fields 함수는 공백을 기준으로 문자열을 쪼개어 문자열 슬라이스로 저장합니다.
  • strings.FieldsFunc 함수는 유니코드 검사 함수를 정의한 뒤 특정 유니코드 값을 기준으로 문자열을 쪼개어 문자열 슬라이스로 저장합니다. 예제에서는 unicode.Is 함수를 사용하여 한글 유니코드를 기준으로 문자열을 쪼갭니다. 따라서 Hello안녕Hello는 한글 유니코드인 안녕 부분을 기준으로 쪼개져서 [Hello Hello]가 됩니다.
  • strings.Repeat 함수는 문자열을 특정 횟수만큼 반복합니다.
  • strings.Replace 함수는 문자열에서 특정 문자열을 바꿉니다. 두 번째 매개변수로 바꿀 횟수를 설정할 수 있습니다.

이번에는 문자열을 다듬는(trim) 방법입니다.

package main

import (
	"fmt"
	"strings"
	"unicode"
)

func main() {
	fmt.Println(strings.Trim("Hello,~~ world!~~", "~~")) // Hello,~~ world!
	fmt.Println(strings.Trim("  Hello, world!  ", " "))  // Hello, world!

	fmt.Println(strings.TrimLeft("~~Hello,~~ world!~~", "~~"))  // Hello,~~ world!~~
	fmt.Println(strings.TrimRight("~~Hello,~~ world!~~", "~~")) // ~~Hello,~~ world!

	f := func(r rune) bool {
		return unicode.Is(unicode.Hangul, r) // r이 한글 유니코드이면 true를 리턴
	}
	var s = "안녕 Hello 고 Go 언어"
	fmt.Println(strings.TrimFunc(s, f))      //  Hello 고 Go
	fmt.Println(strings.TrimLeftFunc(s, f))  //  Hello 고 Go 언어
	fmt.Println(strings.TrimRightFunc(s, f)) // 안녕 Hello 고 Go

	fmt.Println(strings.TrimSpace("  Hello, world!		")) // Hello, world!

	fmt.Println(strings.TrimSuffix("Hello, world!", "orld!")) // Hello, w
	fmt.Println(strings.TrimSuffix("Hello, world!", "wor"))   // Hello, world!
}
  • strings.Trim 함수는 문자열의 앞뒤에 있는 특정 문자열을 제거합니다. 단, 문자열 중간에 있는 문자열은 제거하지 않습니다.
  • strings.TrimLeft, strings.TrimRight 함수는 문자열 앞이나 뒤에 오는 특정 문자열을 제거합니다. 마찬가지로 문자열 중간에 있는 문자열은 제거하지 않습니다.
  • strings.TrimFunc 함수는 문자열 정리 함수를 정의하여 문자열을 정리합니다. 예제에서는 문자열 앞뒤에 오는 한글을 제거합니다.
  • strings.TrimLeftFunc, strings.TrimRightFunc 함수는 문자열 정리 함수를 정의하여 문자열 앞이나 뒤에 오는 문자열을 제거합니다.
  • strings.TrimSpace 함수는 문자열 앞뒤에 오는 공백 문자를 제거합니다. 공백 문자(스페이스)와 탭 문자를 동시에 제거할 수 있습니다. 따라서 공백 문자와 탭 문자를 제거하기 위해 strings.Trim 함수를 두 번 사용하지 않아도 됩니다. 마찬가지로 문자열 중간에 있는 공백, 탭 문자는 제거하지 않습니다.
  • strings.TrimSuffix 함수는 접미사를 제거합니다. 마지막부터 문자열이 일치해야하며 중간만 일치하면 제거하지 않습니다.

다음은 여러 개의 문자열을 동시에 바꾸는 방법입니다.

package main

import (
	"fmt"
	"strings"
)

func main() {
	r := strings.NewReplacer("<", "&lt;", ">", "&gt;")              // 바꿀 문자열을 지정
	fmt.Println(r.Replace("<div><span>Hello, world!</span></div>")) // HTML에서 < >를 &lt; &gt;로 바꿈
}

실행 결과

&lt;div&gt;&lt;span&gt;Hello, world!&lt;/span&gt;&lt;/div&gt;

strings.NewReplacer로 바꿀 문자열을 지정합니다. “기존 문자열”, “새 문자열” 순서로 바꿀 문자열을 여러 개 설정할 수 있습니다. 예제에서는 HTML 문자열에서 태그를 HTML 엔티티 코드(entity code)로 바꿉니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015