150

のような入力文字列が与えられた場合、" word1 word2 word3 word4 "これを Go で文字列の配列として分割する最良の方法は何でしょうか? 各単語の間に任意の数のスペースまたは Unicode 間隔文字を入れることができることに注意してください。

Java では、someString.trim().split("\\s+").

(注:Goで正規表現を使用して文字列を分割しても、質の高い回答が得られない可能性があります。regexpまたはstringsパッケージの参照へのリンクだけでなく、実際の例を提供してください。)

4

4 に答える 4

319

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

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

于 2012-12-06T06:05:38.437 に答える
11

ヒントを使用している場合: 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
于 2012-12-06T06:35:06.607 に答える
6

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

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

これは次のように評価されます。

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

よりコンパクトまたはより慣用的な表現はありますか?

于 2012-12-06T05:53:12.283 に答える