使用regexp通常比手动完成要慢.由于任务并不复杂,因此非正则表达式解决方案也不复杂.
这是一个简单的函数,可以执行您想要的操作:
func split(s, sep string) (tokens []string) {
fields := strings.FieldsFunc(s, func(r rune) bool {
return strings.IndexRune(sep, r) != -1
})
for _, s2 := range fields {
s2 = strings.TrimSpace(s2)
if s2 != "" {
tokens = append(tokens, s2)
}
}
return
}
测试它:
fmt.Printf("%q
", split("a,b;c, de; ; fg ", ",;"))
fmt.Printf("%q
", split("a[b]c[ de/ / fg ", "[]/"))
["a" "b" "c" "de" "fg"]
["a" "b" "c" "de" "fg"]
改进之处
如果性能是一个问题,并且您必须多次调用此split()函数,则可以使用分隔符创建一个类似于集合的映射,然后重用该映射,因此可以在传递给strings.FieldFunc()的函数内部使用,您可以简单地检查该符文是否在此映射中,因此您无需调用string.IndexRune()即可确定给定符文是否为分隔符.
如果分隔符字符很少(例如1-3个字符),则性能提升可能并不明显,但是如果您使用更多的分隔符,则使用映射可以显着提高性能.
它看起来像这样:
var (
sep1 = map[rune]bool{',': true, ';': true}
sep2 = map[rune]bool{'[': true, ']': true, '/': true}
)
func split(s string, sep map[rune]bool) (tokens []string) {
fields := strings.FieldsFunc(s, func(r rune) bool {
return sep[r]
})
for _, s2 := range fields {
s2 = strings.TrimSpace(s2)
if s2 != "" {
tokens = append(tokens, s2)
}
}
return
}
测试它:
fmt.Printf("%q
", split("a,b;c, de; ; fg ", sep1))
fmt.Printf("%q
", split("a[b]c[ de/ / fg ", sep2))
输出是相同的.在Go Playground上尝试此功能.