Go 语言对字符串的操作主要集中在 strings
包中。常见的字符串操作有:
函数 | 作用 |
---|---|
strconv 包: | |
Atoi(s string) (int, error) | 字符串转整型 |
strings 包: | |
Count(s, substr string) int | 计算子串substr 在字符串s 中出现的次数 |
Compare(a, b string) int | 比较字符串大小 |
Contains(s, substr string) bool | 判断字符串s 中是否包含子串substr |
ContainsAny(s, chars string) bool | 判断字符串s 中是否包含chars 中的某个Unicode字符 |
ContainsRune(s string, r rune) bool | 判断字符串s 中是否包含rune型值为r 的字符 |
Index(s, substr string) int | 查找子串substr 在字符串s 中第一次出现的位置,如果找不到则返回 -1,如果substr 为空,则返回 0 |
LastIndex(s, substr string) int | 查找子串substr 在字符串s 中最后出现的位置 |
IndexRune(s string, r rune) int | 查找rune型值为r 的字符在字符串s 中出现的起始位置 |
IndexAny(s, chars string) int | 查找字符串chars 中字符,在字符串s 中出现的起始位置 |
LastIndexAny(s, chars string) int | 查找字符串s 中出现chars 中字符的最后位置 |
LastIndexByte(s string, c byte) int | 查找byte型字符c 在字符串s 中的位置 |
SplitN(s, sep string, n int) []string | 以字符串sep 为分隔符,将字符串s 切分成n 个子串,结果中不包含sep 本身。如果sep 为空则将s 切分为 Unicode 字符列表,如果s 中没有sep 子串则整个s 作为切片 []string 中的第一个元素返回。参数n 表示最多切出几个子串,s 超出切分大小时,超出部分不再切分。n 超出切分子串个数时,返回实际切分子串数。如果n 为 0,则返回 nil;如果n 小于 0,则不限制切分个数,全部切分 |
SplitAfterN(s, sep string, n int) []string | 以字符串sep 为分隔符,将字符串s 切分成n 个子串,结果中包含sep 本身。如果sep 为空则将s 切分为 Unicode 字符列表,如果s 中没有sep 子串则整个s 作为切片 []string 中的第一个元素返回。参数n 表示最多切出几个子串,s 超出切分大小时,超出部分不再切分。n 超出切分子串个数时,返回实际切分子串数。如果n 为 0,则返回 nil;如果n 小于 0,则不限制切分个数,全部切分 |
Split(s, sep string) []string | 以字符串sep 为分隔符,将s 切分成多个子串,结果中不包含sep 本身。如果sep 为空,则将s 切分成 Unicode 字符列表,如果s 中没有sep 子串,则将整个s 作为 []string 的第一个元素返回 |
SplitAfter(s, sep string) []string | 以字符串sep 为分隔符,将s 切分成多个子串,结果中包含sep 本身。如果sep 为空则将s 切分为 Unicode 字符列表,如果s 中没有sep 子串则整个s 作为切片 []string 中的第一个元素返回。 |
Fields(s string) []string | 以连续的空白字符为分隔符,将s 切分成多个子串,结果中不包含空白字符本身。空白字符有:\t, \n, \v, \f, \r, '', U+0085 (NEL), U+00A0 (NBSP) 。如果s 中只包含空白字符,则返回一个空切片 |
FieldsFunc(s string, f func(rune) bool) []string | 以一个或多个满足函数f(rune) 的字符为分隔符,将s 切分成多个子串,结果中不包含分隔符本身。如果s 中没有满足f(rune) 的字符,则返回一个空切片 |
Join(a []string, sep string) string | 以sep 为拼接符,拼接切片a 中的字符串 |
HasPrefix(s, prefix string) bool | 判断字符串s 是否以prefix 字符串开头,是返回 true,否则返回 false |
HasSuffix(s, suffix string) bool | 判断字符串s 是否以suffix 字符串结尾,是返回 true,否则返回 false |
Map(f func(rune) rune, s string) string | 将字符串s 中满足函数f(rune) 的字符替换为f(rune) 的返回值。如果f(rune) 返回负数,则相应的字符将被删除 |
Repeat(s string, count int) string | 返回字符串s 重复count 次数后的结果 |
ToUpper(s string) string | 将字符串s 中的小写字符转为大写 |
ToLower(s string) string | 将字符串s 中的大写字符转为小写 |
ToTitle(s string) string | 将字符串s 中的首个单词转为Title 形式,大部分字符的Title 格式就是Upper 格式 |
ToUpperSpecial(c unicode.SpecialCase, s string) string | 将字符串s 中的所有字符修改为其大写格式,优先使用c 中的规则进行转换 |
ToLowerSpecial(c unicode.SpecialCase, s string) string | 将字符串s 中的所有字符修改为其小写格式,优先使用c 中的规则进行转换 |
ToTitleSpecial(c unicode.SpecialCase, s string) string | 将字符串s 中的所有字符修改为其Title 格式,优先使用c 中的规则进行转换 |
Title(s string) string | 将字符串s 中的所有单词的首字母修改为其Title 格式(BUG: Title 规则不能正确处理 Unicode 标点符号) |
TrimLeftFunc(s string, f func(rune) bool) string | 删除字符串s 左边连续满足f(rune) 的字符 |
TrimRightFunc(s string, f func(rune) bool) string | 删除字符串s 右边连续满足f(rune) 的字符 |
TrimFunc(s string, f func(rune) bool) string | 删除字符串s 左右两边连续满足f(rune) 的字符 |
IndexFunc(s string, f func(rune) bool) int | 查找字符串s 中第一个满足f(rune) 的字符的字节位置,没有返回 -1 |
LastIndexFunc(s string, f func(rune) bool) int | 查找字符串s 中最后一个满足f(rune) 的字符的字节位置,没有返回 -1 |
Trim(s string, cutset string) string | 删除字符串s 左右两边连续包含cutset 的字符 |
TrimLeft(s string, cutset string) string | 删除字符串s 左边连续包含cutset 的字符 |
TrimRight(s string, cutset string) string | 删除字符串s 右边连续包含cutset 的字符 |
TrimSpace(s string) string | 删除字符串s 左右两边连续的空白字符 |
TrimPrefix(s, prefix string) string | 删除字符串s 头部的prefix 字符串 |
TrimSuffix(s, suffix string) string | 删除字符串s 尾部的suffix 字符串 |
Replace(s, old, new string, n int) string | 替换字符串s 中的old 为new ,如果old 为空则在s 中的每个字符间插入new 包括首尾,n 为替换次数, -1 时替换所有 |
EqualFold(s, t string) bool | 忽略大小写比较字符串s 和t ,相同返回 true,反之返回 false |
1. 字符串转数字
strconv.Atoi:
package main
import (
"fmt"
"strconv"
)
func main() {
var str = "111"
i, _ := strconv.Atoi(str)
fmt.Printf("%d\n", i) // 输出:111
}
2. 大小写规则转换
strings.ToUpperSpecial:将字符串s
中的所有字符修改为其大写格式,优先使用c
中的规则进行转换
strings.ToLowerSpecial:将字符串s
中的所有字符修改为其小写格式,优先使用c
中的规则进行转换
strings.ToTitleSpecial:将字符串s
中的所有字符修改为其Title
格式,优先使用c
中的规则进行转换
c
规则说明,以下列语句为例:
unicode.CaseRange{'A', 'Z', [unicode.MaxCase]rune{3, -3, 0}}
- 其中 'A', 'Z' 表示此规则只影响 'A' 到 'Z' 之间的字符。
- 其中
[unicode.MaxCase]rune
数组表示: - 当使用 ToUpperSpecial 转换时,将字符的 Unicode 编码与第一个元素值(3)相加
- 当使用 ToLowerSpecial 转换时,将字符的 Unicode 编码与第二个元素值(-3)相加
- 当使用 ToTitleSpecial 转换时,将字符的 Unicode 编码与第三个元素值(0)相加
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
// 定义转换规则
var _MyCase = unicode.SpecialCase{
// 将半角逗号替换为全角逗号,ToTitle 不处理
unicode.CaseRange{',', ',',
[unicode.MaxCase]rune{',' - ',', ',' - ',', 0}},
// 将半角句号替换为全角句号,ToTitle 不处理
unicode.CaseRange{'.', '.',
[unicode.MaxCase]rune{'。' - '.', '。' - '.', 0}},
// 将 ABC 分别替换为全角的 ABC、abc,ToTitle 不处理
unicode.CaseRange{'A', 'C',
[unicode.MaxCase]rune{'A' - 'A', 'a' - 'A', 0}},
}
s := "ABCDEF,abcdef."
us := strings.ToUpperSpecial(_MyCase, s)
fmt.Printf("%q\n", us) // 输出:"ABCDEF,ABCDEF。"
ls := strings.ToLowerSpecial(_MyCase, s)
fmt.Printf("%q\n", ls) // 输出:"abcdef,abcdef。"
ts := strings.ToTitleSpecial(_MyCase, s)
fmt.Printf("%q\n", ts) // 输出:"ABCDEF,ABCDEF."
}