web-dev-qa-db-ja.com

Goの空白で文字列を分割しますか?

_" Word1 Word2 Word3 Word4 "_などの入力文字列が与えられた場合、これをGoの文字列の配列として分割する最良の方法は何でしょうか?各ワード間にany個のスペースまたはUnicode間隔文字が存在する可能性があることに注意してください。

Javaでは、単にsomeString.trim().split("\\s+")を使用します。

(注:重複する可能性があります Goで正規表現を使用して文字列を分割する は、質の良い回答を提供しません。regexpまたはstringsパッケージ参照。)

88
ralfoide

stringsパッケージには Fields メソッドがあります。

_someString := "one    two   three four "

words := strings.Fields(someString)

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

DEMO:http://play.golang.org/p/et97S90cIH

ドキュメントから:

func Fields(s string) []string

Fieldsは、文字列sを1つ以上の連続する空白文字の各インスタンスの周りで分割し、sの部分文字列の配列またはsに空白のみが含まれる場合は空のリストを返します。

206
I Hate Lazy

ヒントを使用している場合: 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
8
zzzz

私は次のことを思いつきましたが、それは少し冗長すぎるようです:

import "regexp"
r := regexp.MustCompile("[^\\s]+")
r.FindAllString("  Word1   Word2 Word3   Word4  ", -1)

次のように評価されます:

[]string{"Word1", "Word2", "Word3", "Word4"}

もっとコンパクトな表現やより慣用的な表現はありますか?

3
ralfoide