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


116

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

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

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

Ответы:


248

В stringsпакете есть Fieldsметод.

someString := "one    two   three four "

words := strings.Fields(someString)

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

ДЕМО: http://play.golang.org/p/et97S90cIH

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

func Fields(s string) []string

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


1
К сожалению, strings.Fieldsне игнорирует пробелы в цитируемых частях.
chmike

@chmike Верно, но в тот момент, когда появляются цитаты, вы занимаетесь декодированием или синтаксическим анализом какой-то конкретной кодировки или формата .
mtraceur

@chmike вам может понадобиться shlexдля этого godoc.org/github.com/google/shlex
akhy

8

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

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

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

Срез, возвращаемый этим методом, состоит из всех подстрок s, не содержащихся в срезе, возвращаемом FindAllString. Когда вызывается для выражения, которое не содержит метасимволов, оно эквивалентно strings.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
это похоже на излишество
thwd 06

@Tom Но все равно интересно, даже если это не лучший ответ. Я поддержал этот ответ, потому что кое-что узнал.
Denys Séguret, 06

Обратите внимание, что Fields()пустые строки не возвращаются. Таким образом, количество возвращаемых полей будет различным. Если вы пытаетесь разобрать что-то непротиворечивое, у вас это не сработает. Возможно, вам придется использовать регулярное выражение, если FieldsFunc()также не сработает.
Tom

3

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

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

который оценит:

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

Есть ли более компактное или более идиоматическое выражение?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.