strings.Split仅支持单一分隔符,多分隔符应优先用strings.FieldsFunc;需保留空字段或逻辑复杂时才用regexp.MustCompile。

strings.Split 只支持单个分隔符,不能直接按多个分隔符拆分
strings.Split 的签名是 func Split(s, sep string) []string,第二个参数 sep 是一个字符串,不是正则或字符集。哪怕你传入 " ,;|",它也会把整个字符串当作一个整体分隔符,而不是“空格、逗号、分号、竖线任一字符”。所以直接用它处理多分隔符场景会出错。
用 strings.FieldsFunc 配合自定义判断函数更轻量
如果只是想按“任意一个指定字符”切分(比如空格、逗号、分号、竖线),strings.FieldsFunc 是最简方案:它接收一个 func(rune) bool,返回 true 的字符会被视为分隔符并被跳过,且自动合并连续分隔符、忽略首尾空白。
import "strings"
s := "a,b;c|d e"
chars := map[rune]bool{',': true, ';': true, '|': true, ' ': true}
result := strings.FieldsFunc(s, func(r rune) bool {
return chars[r]
})
// result == []string{"a", "b", "c", "d", "e"}
注意:FieldsFunc 不保留空字段(类似 strings.Fields),如果你需要保留中间的空串(如 "a,,b" → ["a", "", "b"]),就不能用它。
需要保留空字段时,用 regexp.MustCompile 替代
当必须保留空字段,或分隔符逻辑更复杂(比如含转义、可变长度),就得上正则。regexp.MustCompile 编译一次后复用,性能足够好;用 Split 方法配合字符类 [] 即可:
立即学习“go语言免费学习笔记(深入)”;
import (
"regexp"
"strings"
)
re := regexp.MustCompile(`[,;|\s]+`) // \s 包含空格、制表符等
s := "a,b;;c| d"
result := re.Split(s, -1)
// result == []string{"a", "b", "c", "d"},注意连续分隔符只切一次
// 若想保留空字段,改用 `[,;|\s]`(去掉 +),但需注意边界
常见坑点:
-
Split(s, -1)才返回全部子串(含末尾空串);Split(s, n)中n 等价于-1,但写清楚更安全 - 正则中
\s匹配所有 Unicode 空白符,若只需 ASCII 空格,写成[,;| ] - 如果分隔符本身含正则元字符(如
.、*),必须转义,例如[,;|\.\*]
性能与适用场景选择建议
简单字符集(≤10 个)+ 不需空字段 → 优先用 strings.FieldsFunc,零分配、无正则开销;
需保留空字段 / 分隔符含长度变化(如 "and"、"or")/ 含转义逻辑 → 必须用 regexp;
高频调用(如每秒万次以上)且分隔符固定,可预编译 *regexp.Regexp 并复用,避免重复 MustCompile。
别在循环里反复调用 regexp.Compile,也别为单次简单拆分引入正则依赖——Go 的标准库设计就是让多数情况用原生字符串函数搞定。









