Frage Teilen Sie eine Zeichenfolge in Whitespace in Go?


Eine eingegebene Zeichenfolge wie z " word1 word2 word3 word4 ", was wäre der beste Ansatz, um dies als ein Array von Strings in Go zu teilen? Beachten Sie, dass es sein kann irgendein Anzahl der Leerzeichen oder Unicode-Leerzeichen zwischen jedem Wort.

In Java würde ich einfach verwenden someString.trim().split("\\s+").

(Hinweis: möglich duplizieren Split-String mit regulärem Ausdruck in Go gibt keine gute Antwort. Bitte geben Sie ein konkretes Beispiel an, nicht nur einen Link zum regexp oder strings Pakete Referenz.)


75
2017-12-06 05:53


Ursprung


Antworten:


Das strings Paket hat a Fields Methode.

someString := "one    two   three four "

words := strings.Fields(someString)

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

DEMO:


170
2017-12-06 06:05



Wenn du Tipp verwendest: regexp.Split

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

Zerlegt Sls in Teilstrings, die durch den Ausdruck getrennt sind, und gibt sie zurück ein Stück der Teilstrings zwischen diesen Ausdrucksübereinstimmungen.

Das von dieser Methode zurückgegebene Segment besteht aus allen Teilzeichenfolgen von s, das nicht in dem von FindAllString zurückgegebenen Slice enthalten ist. Wenn angerufen Bei einem Ausdruck, der keine Metazeichen enthält, entspricht er strings.SplitN.

Beispiel:

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

Die Anzahl bestimmt die Anzahl der zurückzugebenden Teilzeichenfolgen:

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

6
2017-12-06 06:35



Ich habe mir folgendes ausgedacht, aber das erscheint ein bisschen zu ausführlich:

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

was wird auswerten zu:

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

Gibt es einen kompakteren oder mehr idiomatischen Ausdruck?


2
2017-12-06 05:53