web-dev-qa-db-fra.com

Fractionner une chaîne sur les espaces dans Go?

Étant donné une chaîne d'entrée telle que " Word1 Word2 Word3 Word4 ", Quelle serait la meilleure approche pour scinder cela en un tableau de chaînes dans Go? Notez qu'il peut y avoir n'importe quel nombre d'espaces ou de caractères d'espacement Unicode entre chaque mot.

Dans Java je voudrais simplement utiliser someString.trim().split("\\s+")].

(Remarque: les doublons possibles Scinder une chaîne en utilisant une expression rationnelle dans Go ne donne aucune réponse de bonne qualité. Veuillez fournir un exemple concret, et pas seulement un lien vers le regexp ou strings référence des paquets.)

88
ralfoide

Le paquetage strings a une méthode Fields .

someString := "one    two   three four "

words := strings.Fields(someString)

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

DÉMO: http://play.golang.org/p/et97S90cIH

De la docs:

func Fields(s string) []string

Fields divise la chaîne s autour de chaque occurrence d’un ou plusieurs caractères d’espace blanc consécutifs et renvoie un tableau de sous-chaînes de s ou une liste vide si s ne contient que des espaces.

206
I Hate Lazy

Si vous utilisez tip: regexp.Split

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

Fractionnez les tranches en sous-chaînes séparées par l'expression et renvoie une tranche des sous-chaînes entre ces correspondances d'expression.

La tranche renvoyée par cette méthode est constituée de toutes les sous-chaînes de s non contenues dans la tranche renvoyée par FindAllString. Lorsqu'elle est appelée dans une expression ne contenant pas de métacaractères, elle équivaut à strings.SplitN.

Exemple:

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

Le nombre détermine le nombre de sous-chaînes à renvoyer:

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

Je suis venu avec ce qui suit, mais cela semble un peu trop verbeux:

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

qui évaluera à:

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

Existe-t-il une expression plus compacte ou plus idiomatique?

3
ralfoide