Go에서 공백으로 문자열을 분할 하시겠습니까?


115

와 같은 입력 문자열이 주어지면 " word1 word2 word3 word4 "Go에서 이것을 문자열 배열로 분할하는 가장 좋은 방법은 무엇입니까? 참고가 될 수 있는 각 단어 사이에 공백 또는 유니 코드-간격 문자 수.

Java에서는 someString.trim().split("\\s+").

(참고 : Go에서 정규 표현식을 사용하는 중복 분할 문자열 은 좋은 답변을 제공하지 않습니다. regexp또는 strings패키지 참조에 대한 링크가 아닌 실제 예제를 제공하십시오 .)

답변:


248

strings패키지는이 Fields방법을.

someString := "one    two   three four "

words := strings.Fields(someString)

fmt.Println(words, len(words)) // [one two three four] 4

데모: http://play.golang.org/p/et97S90cIH

문서에서 :

func Fields(s string) []string

Fields s는 하나 이상의 연속 된 공백 문자의 각 인스턴스 주위 에서 문자열을 분할하여 의 하위 문자열 배열 s또는 s에 공백 만 포함 된 경우 빈 목록을 반환합니다.


1
불행히도 strings.Fields따옴표 부분의 공백을 무시하지 마십시오.
chmike

@chmike 사실이지만 따옴표가 관련되는 순간 특정 인코딩 또는 형식디코딩 하거나 구문 분석 하는 비즈니스에 있습니다.
mtraceur

@chmike 당신이해야 할 수도 있습니다 shlex그것을 위해 godoc.org/github.com/google/shlex
akhy

8

팁을 사용하는 경우 : regexp.Split

func (re *Regexp) Split(s string, n int) []string

슬라이스 s를 표현식으로 구분 된 하위 문자열로 분할하고 해당 표현식 일치 사이에 하위 문자열의 슬라이스를 반환합니다.

이 메서드에 의해 반환 된 슬라이스는 FindAllString에서 반환 된 슬라이스에 포함되지 않은 s의 모든 하위 문자열로 구성됩니다. 메타 문자가없는 표현식에서 호출되면 strings.SplitN과 동일합니다.

예:

s := regexp.MustCompile("a*").Split("abaabaccadaaae", 5)
// s: ["", "b", "b", "c", "cadaaae"]

개수는 반환 할 부분 문자열의 수를 결정합니다.

n > 0: at most n substrings; the last substring will be the unsplit remainder.
n == 0: the result is nil (zero substrings)
n < 0: all substrings

3
이 잔인한 것 같아
thwd

@Tom 그러나 여기에서 최고의 답변이 아니더라도 여전히 흥미 롭습니다. 내가 뭔가를 배웠기 때문에이 답변을 찬성했습니다.
Denys Séguret

당신은주의해야 Fields()빈 문자열을 반환하지 않습니다. 따라서 반환되는 필드 수는 다양합니다. 일관된 것을 파싱하려는 경우 작동하지 않습니다. FieldsFunc()가 작동하지 않으면 정규식을 사용해야 할 수도 있습니다 .
Tom

3

다음을 생각해 냈지만 너무 장황 해 보입니다.

import "regexp"
r := regexp.MustCompile("[^\\s]+")
r.FindAllString("  word1   word2 word3   word4  ", -1)

다음과 같이 평가됩니다.

[]string{"word1", "word2", "word3", "word4"}

더 간결하거나 더 관용적 인 표현이 있습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.