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


115

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

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

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


1
残念ながら、strings.Fields引用部分のスペースは無視しません。
chmike 2018

@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によって返されるスライスに含まれていないのすべての部分文字列で構成されます。メタ文字を含まない式で呼び出される場合、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

@トムしかし、それがここでの最良の答えではない場合でも、それはまだ興味深いです。私は何かを学んだので、私はこの答えを支持しました。
DenysSéguret12年

Fields()空の文字列を返さないことに注意してください。したがって、返されるフィールドの数は異なります。一貫性のあるものを解析しようとすると、それはうまくいきません。FieldsFunc()も機能しない場合は、正規表現を使用する必要があります。
トム

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.