在Go中的空白处分割字符串?


115

给定一个输入字符串,例如" word1 word2 word3 word4 ",在Go中将其拆分为字符串数组的最佳方法是什么?请注意,每个单词之间可以有任意数量的空格或Unicode空格字符。

在Java中,我只会使用someString.trim().split("\\s+")

(注意:在Go使用正则表达式可能重复的Split字符串并不能提供任何高质量的答案。请提供实际示例,而不仅仅是提供指向regexpstrings包引用的链接。)

Answers:


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

字段在s一个或多个连续的空白字符的每个实例周围拆分字符串,s如果s仅包含空格,则返回的子字符串数组或一个空列表。


1
不幸的是,strings.Fields不要忽略引用部分中的空格。
chmike

@chmike是的,但是当引号涉及时,您就需要解码解析某些特定的编码格式
mtraceur

@chmike,您可能需要shlex该文件godoc.org/github.com/google/shlex
akhy,

8

如果您使用技巧:regexp.Split

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

将片段s分割成由表达式分隔的子字符串,并返回这些表达式匹配之间的子字符串的片段。

此方法返回的片由未包含在FindAllString返回的片中的s的所有子字符串组成。在不包含元字符的表达式上调用时,它等效于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
这似乎是一个过大的杀伤力
2012年

@Tom但是,即使这不是最佳答案,它仍然很有趣。我赞成这个答案,因为我学到了一些东西。
DenysSéguret'12

您应该注意,Fields()不会返回空字符串。因此,返回的字段数将有所不同。如果您尝试解析一致的内容,那么它将对您不起作用。如果FieldsFunc()也无法使用,则可能需要使用正则表达式。
2014年

3

我提出了以下建议,但这似乎太冗长了:

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

评估结果为:

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

有没有更紧凑或更惯用的表达方式?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.