¿Dividir una cadena en un espacio en blanco en Go?

115

Dada una cadena de entrada como " word1 word2 word3 word4 ", ¿cuál sería el mejor enfoque para dividir esto como una matriz de cadenas en Go? Tenga en cuenta que puede haber cualquier número de espacios o caracteres con espaciado Unicode entre cada palabra.

En Java solo usaría someString.trim().split("\\s+").

(Nota: la posible cadena dividida duplicada utilizando una expresión regular en Go no da una respuesta de buena calidad. Proporcione un ejemplo real, no solo un enlace a la referencia de paquetes regexpo strings).

ralfoide
fuente

Respuestas:

248

El stringspaquete tiene un 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

De los documentos:

func Fields(s string) []string

Fields divide la cadena salrededor de cada instancia de uno o más caracteres de espacio en blanco consecutivos, devolviendo una matriz de subcadenas de so una lista vacía si s contiene solo espacios en blanco.

Odio la pereza
fuente
1
Desafortunadamente, strings.Fieldsno ignora los espacios en las partes citadas.
chmike
@chmike Es cierto, pero en el momento en que se involucran las citas, usted está en el negocio de decodificar o analizar alguna codificación o formato específico .
mtraceur
@chmike, es posible que necesite shlexpara eso godoc.org/github.com/google/shlex
akhy
8

Si está usando tip: regexp.Split

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

Divide los segmentos en subcadenas separadas por la expresión y devuelve un segmento de las subcadenas entre esas coincidencias de expresión.

El segmento devuelto por este método consta de todas las subcadenas de s no contenidas en el segmento devuelto por FindAllString. Cuando se llama a una expresión que no contiene metacaracteres, es equivalente a strings.SplitN.

Ejemplo:

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

El recuento determina el número de subcadenas que se devolverán:

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
fuente
3
esto parece una exageración
jueves
@Tom Pero sigue siendo interesante incluso si no es la mejor respuesta aquí. Elegí esta respuesta porque aprendí algo.
Denys Séguret
Debe tener en cuenta que Fields()no devolverá cadenas vacías. Entonces, la cantidad de campos devueltos variará. Si está tratando de analizar algo consistente, entonces no funcionará para usted. Es posible que deba usar expresiones regulares si FieldsFunc()tampoco funciona.
Tom
3

Se me ocurrió lo siguiente, pero parece un poco demasiado detallado:

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

que evaluará a:

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

¿Existe una expresión más compacta o más idiomática?

ralfoide
fuente