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.