Разделить строку на пробелы в Go?

Учитывая входную строку, такую ​​как " word1 word2 word3 word4 ", какой был бы лучший подход к ее разбиению как массива строк в Go? Обратите внимание, что между каждым словом может быть любое количество пробелов или символов между символами unicode.

В Java я бы просто использовал someString.trim().split("\\s+").

(Примечание: возможный дубликат Разделение строки с использованием регулярного выражения в Go не дает никакого качественного ответа. Просьба представить фактический пример, а не только ссылку на regexp или strings.)

Ответ 1

В пакете strings есть Fields.

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

Из документов:

func Fields(s string) []string

Поля разбивают строку s вокруг каждого экземпляра одного или нескольких последовательных символов пробела, возвращая массив подстрок s или пустой список, если s содержит только пробел.

Ответ 2

Если вы используете подсказку: regexp.Split

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

Разделить срезы s на подстроки, разделенные выражением, и возвращает фрагмент подстрок между этими выражениями совпадает.

Ломтик, возвращаемый этим методом, состоит из всех подстрок s не содержится в срезе, возвращаемом FindAllString. Когда вызывается на выражение, которое не содержит метасимволов, оно эквивалентно строкам .SplitN.

Пример:

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

Счетчик определяет количество возвращаемых подстрок:

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

Я придумал следующее, но это кажется слишком многословным:

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

который будет оцениваться следующим образом:

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

Существует ли более компактное или более идиоматическое выражение?