Pisahkan string pada spasi di Go?

115

Diberikan string input seperti " word1 word2 word3 word4 ", apa pendekatan terbaik untuk memisahkan ini sebagai array string di Go? Perhatikan bahwa mungkin ada sejumlah spasi atau karakter spasi unicode di antara setiap kata.

Di Jawa saya hanya akan menggunakan someString.trim().split("\\s+").

(Catatan: kemungkinan duplikat string Pemisah menggunakan ekspresi reguler di Go tidak memberikan jawaban yang berkualitas baik. Harap berikan contoh sebenarnya, bukan hanya tautan ke regexpatau stringsreferensi paket.)

ralfoide.dll
sumber

Jawaban:

248

The stringspaket memiliki Fieldsmetode.

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

Dari dokumen:

func Fields(s string) []string

Fields membagi string di ssekitar setiap instance dari satu atau lebih karakter spasi kosong yang berurutan, mengembalikan larik substring satau daftar kosong jika s hanya berisi spasi putih.

Saya Benci Malas
sumber
1
Sayangnya, strings.Fieldsjangan abaikan spasi di bagian yang dikutip.
chmike
@chmike Benar, tetapi saat kutipan terlibat, Anda berada dalam bisnis decoding atau parsing beberapa encoding atau format tertentu .
mtraceur
@chmike Anda mungkin perlu shlexuntuk godoc.org/github.com/google/shlex itu
akhy
8

Jika Anda menggunakan tip: regexp.Split

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

Membagi irisan menjadi beberapa substring yang dipisahkan oleh ekspresi dan mengembalikan potongan substring di antara ekspresi yang cocok.

Potongan yang dikembalikan oleh metode ini terdiri dari semua substring s yang tidak terdapat dalam potongan yang dikembalikan oleh FindAllString. Saat dipanggil pada ekspresi yang tidak berisi karakter meta, itu setara dengan strings.SplitN.

Contoh:

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

Hitungan menentukan jumlah substring yang akan dikembalikan:

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
zzzz
sumber
3
ini sepertinya berlebihan
melalui
@Tom Tapi itu masih menarik meskipun itu bukan jawaban terbaik di sini. Saya memuji jawaban ini karena saya belajar sesuatu.
Denys Séguret
Anda harus mencatat bahwa Fields()tidak akan mengembalikan string kosong. Jadi jumlah field yang dikembalikan akan bervariasi. Jika Anda mencoba mengurai sesuatu secara konsisten, itu tidak akan berhasil untuk Anda. Anda mungkin perlu menggunakan regex jika a FieldsFunc()juga tidak berfungsi.
Tom
3

Saya datang dengan yang berikut ini, tetapi itu tampaknya terlalu bertele-tele:

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

yang akan dievaluasi menjadi:

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

Apakah ada ekspresi yang lebih kompak atau lebih idiomatis?

ralfoide.dll
sumber