Dividir uma string em espaços em branco no Go?

115

Dada uma string de entrada como " word1 word2 word3 word4 ", qual seria a melhor abordagem para dividir isso como uma matriz de strings no Go? Observe que pode haver qualquer número de espaços ou caracteres de espaçamento unicode entre cada palavra.

Em Java eu ​​usaria apenas someString.trim().split("\\s+").

(Observação: uma possível sequência de divisão duplicada usando uma expressão regular em Go não fornece uma resposta de boa qualidade. Forneça um exemplo real, não apenas um link para a referência do pacote regexpou strings.)

ralfoide
fonte

Respostas:

248

O stringspacote tem um Fieldsmétodo.

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

Dos documentos:

func Fields(s string) []string

Campos divide a string em storno de cada instância de um ou mais caracteres de espaço em branco consecutivos, retornando uma matriz de substrings de sou uma lista vazia se s contiver apenas espaço em branco.

Eu odeio preguiçoso
fonte
1
Infelizmente, strings.Fieldsnão ignora espaços nas partes citadas.
chmike
@chmike Verdadeiro, mas no momento em que as citações se envolvem, você está no negócio de decodificar ou analisar alguma codificação ou formato específico .
mtraceur
@chmike, talvez você precise shlexdisso godoc.org/github.com/google/shlex
akhy
8

Se você estiver usando a dica: regexp.Split

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

Divide fatias s em substrings separadas pela expressão e retorna uma fatia das substrings entre essas correspondências de expressão.

A fatia retornada por esse método consiste em todas as substrings de s não contidas na fatia retornada por FindAllString. Quando chamado em uma expressão que não contém metacaracteres, é equivalente a strings.SplitN.

Exemplo:

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

A contagem determina o número de substrings a serem retornadas:

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
fonte
3
isso parece um exagero
dia
@Tom Mas ainda é interessante, mesmo que não seja a melhor resposta aqui. Votei positivamente nesta resposta porque aprendi algo.
Denys Séguret
Você deve notar que Fields()não retornará strings vazias. Portanto, o número de campos retornados irá variar. Se você está tentando analisar algo consistente, não funcionará para você. Pode ser necessário usar regex se um FieldsFunc()também não funcionar.
Tom
3

Eu vim com o seguinte, mas isso parece um pouco prolixo:

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

que avaliará para:

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

Existe uma expressão mais compacta ou mais idiomática?

ralfoide
fonte