0%

在Golang中用多个分隔符拆分字符串

遇到问题

Golang 中默认的 strings.Split 方法对于字符串分隔的能力有限,仅支持一次对单个分隔符进行操作:

1
2
3
4
5
6
s := "11111|2222||3333||4444|"  
seps := "|"
rs := strings.Split(s, seps)
fmt.Println(rs)

// [11111 2222 3333 4444 ]

如果想要一次处理多个分隔符的情况,使用 strings.Split 就会出错:

1
2
3
4
5
6
s := "11111|2222||3333,4444,,555"  
seps := ",|"
rs := strings.Split(s, seps)
fmt.Println(rs)

// [11111|2222||3333,4444,,555]

可以看到并没有对字符串做处理,直接返回了。

如果想要支持多个分隔符,则需要分别进行处理。

而且还有一点,Split 对于 为空 的情况并不能自行处理。如上面第一个示例,可以看到输出的结果中是有空内容存在的。


如何解决

遇到这种情况,可以使用 strings 中另一个方法 strings.FieldsFunc 来进行处理。

1
2
3
4
5
6
7
8
s := "11111|2222||3333,4444,,555"  
seps := ",|"
rs2 := strings.FieldsFunc(s, func(r rune) bool {
return strings.ContainsRune(seps, r)
})
fmt.Println(rs2)

// [11111 2222 3333 4444 555]

可以看到得到了我们想要的结果。另外,其中的 ContainsRune 方法也自动对 空内容 进行了过滤。

另外,对于其中的处理函数 func(r rune) bool {} 我们也可以任意更改操作逻辑,以应对不同的需求。


深入探究

Golang中的strings.FieldsFunc()函数用于在每次运行满足 f(c) 的Unicode代码点 c 时拆分给定的字符串str,并返回由str组成的切片数组。

相应的语法:

1
func FieldsFunc(str string,f func(rune bool)[] string

返回值:如果str中的所有代码点都满足 f(c) 或字符串为空,则返回一个空片。

再举一个示例:

1
2
3
4
5
6
7
8
f := func(c rune) bool {  
return unicode.IsNumber(c)
}

res := strings.FieldsFunc("ABC13DEF556", f)
fmt.Println(res)

// [ABC DEF]

整理

将其整理成一个工具方法:

1
2
3
4
5
6
7
// 对字符串使用任意字符分隔  
func StrSplitAny(s string, seps string) []string {
splitter := func(r rune) bool {
return strings.ContainsRune(seps, r)
}
return strings.FieldsFunc(s, splitter)
}

参考

如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc