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("", "Bernardo O'Higgins"))
// 在 s 中查找 sep 的第一次出现,返回第一次出现的索引 funcIndex(s, sep string)int // 在 s 中查找字节 c 的第一次出现,返回第一次出现的索引 funcIndexByte(s string, c byte)int // chars 中任何一个 Unicode 代码点在 s 中首次出现的位置 funcIndexAny(s, chars string)int // 查找字符 c 在 s 中第一次出现的位置,其中 c 满足 f(c) 返回 true funcIndexFunc(s string, f func(rune)bool) int // Unicode 代码点 r 在 s 中第一次出现的位置 funcIndexRune(s string, r rune)int
// 有三个对应的查找最后一次出现的位置 funcLastIndex(s, sep string)int funcLastIndexByte(s string, c byte)int funcLastIndexAny(s, chars string)int funcLastIndexFunc(s string, f func(rune)bool) int
在 2.1.1 小节提到过,Contain 相关的函数内部调用的是响应的 Index 函数。
这一序列函数,只举 IndexFunc 的例子:
1 2 3 4 5
han := func(c rune)bool { return unicode.Is(unicode.Han, c) // 汉字 } fmt.Println(strings.IndexFunc("Hello, world", han)) fmt.Println(strings.IndexFunc("Hello, 世界", han))
Map 函数,将 s 的每一个字符按照 mapping 的规则做映射替换,如果 mapping 返回值 <0 ,则舍弃该字符。该方法只能对每一个字符做处理,但处理方式很灵活,可以方便的过滤,筛选汉字等。
示例:
1 2 3 4 5 6 7 8 9 10 11 12
mapping := func(r rune)rune { switch { case r >= 'A' && r <= 'Z': // 大写字母转小写 return r + 32 case r >= 'a' && r <= 'z': // 小写字母不处理 return r case unicode.Is(unicode.Han, r): // 汉字换行 return'\n' } return-1// 过滤所有非字母、汉字的字符 } fmt.Println(strings.Map(mapping, "Hello你#¥%……\n('World\n,好Hello^(&(*界gopher..."))
输出结果:
1 2 3 4
hello world hello gopher
10.字符串子串替换
进行字符串替换时,考虑到性能问题,能不用正则尽量别用,应该用这里的函数。
字符串替换的函数签名如下:
1 2 3 4 5
// 用 new 替换 s 中的 old,一共替换 n 个。 // 如果 n < 0,则不限制替换次数,即全部替换 funcReplace(s, old, newstring, n int)string // 该函数内部直接调用了函数 Replace(s, old, new , -1) funcReplaceAll(s, old, newstring)string
hello world ā á ǎ à 壹 hello world önnek iş önnek iş HELLO WORLD Ā Á Ǎ À // 汉字拼音有效 一 // 汉字无效 HELLO WORLD ÖRNEK IŞ ÖRNEK İŞ // 有细微差别
12.标题处理
1 2 3
funcTitle(s string)string funcToTitle(s string)string funcToTitleSpecial(c unicode.SpecialCase, s string)string
标题处理包含 3 个相关函数,其中 Title 会将 s 每个单词的首字母大写,不处理该单词的后续字符。ToTitle 将 s 的每个字母大写。ToTitleSpecial 将 s 的每个字母大写,并且会将一些特殊字母转换为其对应的特殊大写字母。
举个例子:
1 2 3 4 5 6 7 8 9
fmt.Println(strings.Title("hElLo wOrLd")) fmt.Println(strings.ToTitle("hElLo wOrLd")) fmt.Println(strings.ToTitleSpecial(unicode.TurkishCase, "hElLo wOrLd")) fmt.Println(strings.Title("āáǎà ōóǒò êēéěè")) fmt.Println(strings.ToTitle("āáǎà ōóǒò êēéěè")) fmt.Println(strings.ToTitleSpecial(unicode.TurkishCase, "āáǎà ōóǒò êēéěè")) fmt.Println(strings.Title("dünyanın ilk borsa yapısı Aizonai kabul edilir")) fmt.Println(strings.ToTitle("dünyanın ilk borsa yapısı Aizonai kabul edilir")) fmt.Println(strings.ToTitleSpecial(unicode.TurkishCase, "dünyanın ilk borsa yapısı Aizonai kabul edilir"))
输出结果:
1 2 3 4 5 6 7 8 9
HElLo WOrLd HELLO WORLD HELLO WORLD Āáǎà Ōóǒò Êēéěè ĀÁǍÀ ŌÓǑÒ ÊĒÉĚÈ ĀÁǍÀ ŌÓǑÒ ÊĒÉĚÈ Dünyanın Ilk Borsa Yapısı Aizonai Kabul Edilir DÜNYANIN ILK BORSA YAPISI AIZONAI KABUL EDILIR DÜNYANIN İLK BORSA YAPISI AİZONAİ KABUL EDİLİR
13.修剪(Trim)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// 将 s 左侧和右侧中匹配 cutset 中的任一字符的字符去掉 funcTrim(s string, cutset string)string // 将 s 左侧的匹配 cutset 中的任一字符的字符去掉 funcTrimLeft(s string, cutset string)string // 将 s 右侧的匹配 cutset 中的任一字符的字符去掉 funcTrimRight(s string, cutset string)string // 如果 s 的前缀为 prefix 则返回去掉前缀后的 string , 否则 s 没有变化。 funcTrimPrefix(s, prefix string)string // 如果 s 的后缀为 suffix 则返回去掉后缀后的 string , 否则 s 没有变化。 funcTrimSuffix(s, suffix string)string // 将 s 左侧和右侧的间隔符去掉。常见间隔符包括:'\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL) funcTrimSpace(s string)string // 将 s 左侧和右侧的匹配 f 的字符去掉 funcTrimFunc(s string, f func(rune)bool) string // 将 s 左侧的匹配 f 的字符去掉 funcTrimLeftFunc(s string, f func(rune)bool) string // 将 s 右侧的匹配 f 的字符去掉 funcTrimRightFunc(s string, f func(rune)bool) string
type Reader struct { s string// Reader 读取的数据来源 i int// current reading index(当前读的索引位置) prevRune int// index of previous rune; or < 0(前一个读取的 rune 索引位置) }
// 该方法向 b 写入一个字节 func(b *Builder)WriteByte(c byte)error // WriteRune 方法向 b 写入一个字符 func(b *Builder)WriteRune(r rune)(int, error) // WriteRune 方法向 b 写入字节数组 p func(b *Builder)Write(p []byte)(int, error) // WriteRune 方法向 b 写入字符串 s func(b *Builder)WriteString(s string)(int, error) // Len 方法返回 b 的数据长度。 func(b *Builder)Len()int // Cap 方法返回 b 的 cap。 func(b *Builder)Cap()int // Grow 方法将 b 的 cap 至少增加 n (可能会更多)。如果 n 为负数,会导致 panic。 func(b *Builder)Grow(n int) // Reset 方法将 b 清空 b 的所有内容。 func(b *Builder)Reset() // String 方法将 b 的数据以 string 类型返回。 func(b *Builder)String()string
Builder 有 4 个与写入相关的方法,这 4 个方法的 error 都总是为 nil.
Builder 的 cap 会自动增长,一般不需要手动调用 Grow 方法。
String 方法可以方便的获取 Builder 的内容。
举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
b := strings.Builder{} _ = b.WriteByte('7') n, _ := b.WriteRune('夕') fmt.Println(n) n, _ = b.Write([]byte("Hello, World")) fmt.Println(n) n, _ = b.WriteString("你好,世界") fmt.Println(n) fmt.Println(b.Len()) fmt.Println(b.Cap()) b.Grow(100) fmt.Println(b.Len()) fmt.Println(b.Cap()) fmt.Println(b.String()) b.Reset() fmt.Println(b.String())
输出结果:
1 2 3 4 5 6 7 8
3 12 15 31 32 31 164 7夕Hello, World你好,世界
Post title:Go语言中的字符串操作
Post author:洪笳淏
Create time:2021-11-10 19:30:00
Post link:https://jiahaohong1997.github.io/2021/11/10/Go语言中的字符串操作/
Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.