Golang 分割字符串的实现示例
作者:恋喵大鲤鱼 发布时间:2024-02-23 03:26:10
在开发过程中,很多时候我们有分割字符串的需求,即把一个字符串按照某种分割符进行切割。
在 Go 语言中,分割字符串我们可以分为几种情况,分别为:
按空格分割
按字符分割
按字符串分割
下面分别讲解使用 Golang 如何实现不同方式的字符串分割。
1.按空格分割
ss := strings.Fields(s)
示例:
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz "))
}
输出:
Fields are: ["foo" "bar" "baz"]
2.按字符/字符串分割
ss := strings.Split(s, sep)
可以指定一个字符串作为分隔符,可以指定单个字符作为分隔符,因为单个字符也是一个字符串。
示例:
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split("", ","))
}
输出:
["a" "b" "c"]
["" "man " "plan " "canal panama"]
[" " "x" "y" "z" " "]
[""]
注意,如果待分割串为空串,strings.Split 将返回包含一个空串的切片。
如果希望返回 nil 切片,可以做一下封装。
func Split(s, sep string) []string {
if s == "" {
return nil
}
return strings.Split(s, sep)
}
3.按多个字符分割
标准库 strings 包中有一个函数 FieldsFunc 可以指定多个字符为分隔符。
ss := strings.FieldsFunc(s,f func(rune) bool)
示例:
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
f := func(c rune) bool {
return !unicode.IsLetter(c) && !unicode.IsNumber(c)
}
fmt.Printf("Fields are: %q", strings.FieldsFunc(" foo1;bar2,baz3...", f))
}
输出:
Fields are: ["foo1" "bar2" "baz3"]
4.按多个字符串分割
截至 Go 1.20,标准库暂未供支持多个字符串作为分隔符的分割函数。但是,我们可以基于 strings.Split 编写一个函数来实现这个功能。
// SplitSeps splits string into substring slice by multiple string separators.
// If you want to specify multiple string separators by regexp,
// please refer to `func (*Regexp) Split` in standard library regexp package.
func SplitSeps(s string, seps ...string) []string {
if len(seps) == 0 {
return []string{s}
}
result := strings.Split(s, seps[0])
for _, sep := range seps[1:] {
var temp []string
for _, r := range result {
temp = append(temp, strings.Split(r, sep)...)
}
result = temp
}
return result
}
示例:
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Printf("%q\n", SplitSeps("foo,bar,baz", []string{","}...))
fmt.Printf("%q\n", SplitSeps("foo,bar|baz", []string{",", "|"}...))
fmt.Printf("%q\n", SplitSeps("foo,bar|baz qux", []string{",", "|", " "}...))
fmt.Printf("%q\n", SplitSeps("foo,bar|bazSEPqux", []string{",", "|", "SEP"}...))
fmt.Printf("%q\n", SplitSeps("foo,bar|baz", []string{}...))
fmt.Printf("%q\n", SplitSeps(" xyz", []string{""}...))
}
输出:
["foo" "bar" "baz"]
["foo" "bar" "baz"]
["foo" "bar" "baz" "qux"]
["foo" "bar" "baz" "qux"]
["foo,bar|baz"]
[" " "x" "y" "z"]
5.其他分割函数
除了文中提及的标准库函数,你可能还会用到下面这几个函数来控制字符串的分割方式。
strings.SplitN
func strings.SplitN(s, sep string, n int) []string
该函数与 Split 函数类似,但是可以指定分割后的最大子字符串个数 n,如果 n 为正数,则最多分割成 n 个子字符串;如果 n 为负数,则不限制子字符串个数。例如:
str := "hello,world,how,are,you"
words := strings.SplitN(str, ",", 2)
fmt.Println(words) // ["hello", "world,how,are,you"]
strings.SplitAfter
func SplitAfter(s, sep string) []string
该函数将字符串 s 按照分割符 sep 分割成多个子字符串,并返回一个字符串切片。不同于 Split 函数的是,SplitAfter 函数会在分割符之后分割,例如:
str := "hello,world,how,are,you"
words := strings.SplitAfter(str, ",")
fmt.Println(words) // ["hello,", "world,", "how,", "are,", "you"]
strings.SplitAfterN
func SplitAfterN(s, sep string, n int) []string
该函数与 SplitAfter 函数类似,但是可以指定分割后的最大子字符串个数 n。如果 n 为负数,则不限制子字符串个数。例如:
str := "hello,world,how,are,you"
words := strings.SplitAfterN(str, ",", 2)
fmt.Println(words) // ["hello,", "world,how,are,you"]
6.go-huge-util
借助 Golang 标准库提供的相关函数,分割字符串还是比较方便的。
文中提及的两个函数,已放置 Github 开源工具库 go-huge-util,大家可使用 go mod 方式 import 然后使用。
import "github.com/dablelv/go-huge-util/str"
// Split 如果待分割串为空串,返回 nil 切片而非包含一个空串的切片。
str.Split(s, sep string) []string
// SplitSeps 通过多个字符串分隔符将字符串分割为字符串切片。
str.SplitSeps(s string, seps []string) []string
go-huge-util 除了类型转换,还有很多其他实用函数,如加解密、zip 解压缩等,欢迎大家使用、Star、Issue 和 Pull Request。
参考文献
strings - Go Packages
8 ways to split a string in Go (Golang) - GOSAMPLES
github.com/dablelv/go-huge-util
来源:https://dablelv.blog.csdn.net/article/details/129302023


猜你喜欢
- 如下所示:import pandas as pddef my_min(a, b): return min(abs(a),abs(
- #region 读写xml文件的2个小函数,2005 4 2 by hyc public void 
- 摘要:主要介绍一些python的文件读取功能,文件内容修改,文件名后缀更改等操作。批处理文件功能import ospath1 = '
- 下面先看下python 使用值排序字典的方法In [8]: a={'x':11,'y':22,'c&
- 在 .NET Framework 2.0中,ConfigurationManager类新增了两个属性AppSe
- 废话不多说,直接给大家贴代码了,具体代码如下所示,关键代码如下:<!DOCTYPE html> <html lang=&q
- 你搜索这个,你会发现好多都是np.zeros(5,2),嗯都是复制的一个国外的帖子,然而没有翻译人家的话。然后你愤怒的关闭页面。这简直就是文
- 有时候需要把文件中的数据放入到数组中,这里提供了一种方法,可以根据文件结尾的标记进行数据拆分,然后再把拆分的文件放入数组中# -*-codi
- 逻辑比较简单 ,直接上代码 定时发送直接使用了win服务器的定时任务来定时执行脚本#coding:utf-8from __futu
- pycharm部署anaconda环境Pycharm: python编辑器,社区版本Anaconda:开源的python发行版本(专注于数据
- 在用Python绘制红楼梦词云图文章中讲到我们使用Python把红楼梦中的核心词汇给绘画出来了,但是,红楼梦这么唯美的书,给我们乌漆麻黑的搞
- 需求背景一个统计接口,前端需要返回两个数组,一个是0-23的小时计数,一个是各小时对应的统计数。思路 直接使用group by查询要统计的表
- while循环:while expression: suite_to_repeatwhile 条件: 语
- 本文分析了python3新特性函数注释Function Annotations用法。分享给大家供大家参考,具体如下:Python 3.X新增
- 问题定义一个int型的一维数组,包含40个元素,用来存储每个学员的成绩,循环产生40个0~100之间的随机整数,(1)将它们存储到一维数组中
- MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两
- 如何一行输入多个数,并存入列表在python里,如果你仅使用input()的话是输入一行的内容并将该行的内容以字符串的形式存到变量中,但如果
- 本文实例讲述了JS实现网页滚动条感应鼠标变色的方法。分享给大家供大家参考。具体实现方法如下:<html><head>
- IN为什么慢?在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕。例如:SELECT driver_id FROM driver w
- Pythond 的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。函数是通过