Dividere una stringa su uno spazio bianco in Go?


115

Data una stringa di input come " word1 word2 word3 word4 ", quale sarebbe l'approccio migliore per dividerla come un array di stringhe in Go? Nota che può esserci un numero qualsiasi di spazi o caratteri di spaziatura Unicode tra ogni parola.

In Java userei solo someString.trim().split("\\s+").

(Nota: la possibile stringa Split duplicata che utilizza un'espressione regolare in Go non fornisce alcuna risposta di buona qualità. Fornisci un esempio effettivo, non solo un collegamento al riferimento ai pacchetti regexpo strings.)

Risposte:


248

Il stringspacchetto ha un Fieldsmetodo.

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

Dai documenti:

func Fields(s string) []string

Fields divide la stringa sattorno a ciascuna istanza di uno o più caratteri di spazio bianco consecutivi, restituendo un array di sottostringhe so un elenco vuoto se s contiene solo spazi vuoti.


1
Sfortunatamente, strings.Fieldsnon ignora gli spazi nelle parti citate.
chmike

@chmike Vero, ma nel momento in cui le citazioni vengono coinvolte, sei nel business della decodifica o dell'analisi di una codifica o di un formato specifici .
mtraceur

@chmike potresti aver bisogno shlexper quel godoc.org/github.com/google/shlex
akhy

8

Se stai usando tip: regexp.Split

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

Suddividi le sezioni in sottostringhe separate dall'espressione e restituisce una sezione delle sottostringhe tra quelle corrispondenze di espressione.

La sezione restituita da questo metodo è costituita da tutte le sottostringhe di s non contenute nella sezione restituita da FindAllString. Quando viene chiamato su un'espressione che non contiene metacaratteri, è equivalente a stringhe.

Esempio:

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

Il conteggio determina il numero di sottostringhe da restituire:

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
questo sembra eccessivo
giovedì

@ Tom Ma è comunque interessante anche se non è la risposta migliore qui. Ho votato positivamente questa risposta perché ho imparato qualcosa.
Denys Séguret

Dovresti notare che Fields()non restituirà stringhe vuote. Quindi il numero di campi restituiti varierà. Se stai cercando di analizzare qualcosa di coerente, allora non funzionerà per te. Potrebbe essere necessario utilizzare regex se FieldsFunc()anche a non funziona.
Tom

3

Mi è venuto in mente quanto segue, ma sembra un po 'troppo prolisso:

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

che valuterà:

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

Esiste un'espressione più compatta o più idiomatica?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.