Golang 标准库:strings 包的应用

strings包

Go语言标准库中也存在这样一个名为strings包,额外封装一些方法用于处理字符串。

包含判断

  • 前后缀包含
func main() {
    //前后缀包含
    var str string = "This is a fat cat"
    var str1 string = "Hello Boss!"
    var str2 string = "Lucy is name My"
    fmt.Printf("T/F? Does the string \"%s\" have prefix %s?\n", str, "is") //str的前缀是否包含"is"?
    fmt.Printf("%t\n", strings.HasPrefix(str, "is"))                       //使用HasPrefix方法判断前缀
    fmt.Printf("T/F Does the string \"%s\" have prefix %s?\n", str1, "He")
    fmt.Printf("%t\n", strings.HasPrefix(str1, "He"))
    fmt.Printf("T/F Does the string \"%s\" have prefix %s?\n", str2, "My") //str2的后缀是否包含"y"
    fmt.Printf("%t\n,", strings.HasSuffix(str2, "My"))                     //使用HasSuffix方法判断后缀
}
  • 子字符串包含关系

除了可以检查前后缀,还可以使用Contains方法判断一个字符串的中间是否包含指定子字符串。

func main() {

    //使用ContainsAny方法查询字符串是否包含多个字符,
    fmt.Println(strings.ContainsAny("team", "e"))     //true
    fmt.Println(strings.ContainsAny("chain", ""))     //false
    fmt.Println(strings.ContainsAny("name", "n & m")) //true

    //使用Contains方法查找某个字符串是否存在这个字符串中,若存在,返回true
    fmt.Println(strings.Contains("team", "t & a")) //false
    fmt.Println(strings.Contains("chain", ""))     //true
    fmt.Println(strings.Contains("name", "n & m")) //false
}

与strings.Contains(str, chars)不同的是,strings.ContainsAny(str, chars)能够匹配更广泛的内容,它可以匹配Unicode字符串。

索引

strings包中的Index可以返回指定字符/串的第一个字符的索引值,如果不存在相应的字符串则返回-1

func main() {

    str := "Hello, I'm Job, Yep"
    str1 := "我是完满主任"

    fmt.Printf("The position of \"Job\" is: ")
    fmt.Printf("%d\n", strings.Index(str, "Job")) //使用Index方法返回str的第一个字符"Hello"的索引值8。

    fmt.Printf("The position of the last instance of \"Hi\" is: ")
    fmt.Printf("%d\n", strings.LastIndex(str, "Yep")) //使用LastIndex方法返回str的最后一个字符"Yep"出现的索引位置13。

    fmt.Printf("The position of \"Tim\" is: ")
    fmt.Printf("%d\n", strings.Index(str, "Tiger")) //不存在相应的字符串,返回-1

    //适用于非ASCII编码的字符,使用strings.IndexRune()对字符进行定位
    fmt.Printf("The position of \"满\" is: ")
    fmt.Printf("%d\n", strings.IndexRune(str1, '满')) //一个中文占用3字节长度,第三个字符'满'的索引值是9。
}

替换

在Go语言中,经常使用strings.Replace函数对字符串进行处理。

func main() {
    str := "我是钓鱼城大学的老王!"                       //原字符串
    new := "完满主任"                              //替换的新内容
    old := "老王"                                //被替换的字符串
    n := 1                                     //表示替换到第n个old
    println(strings.Replace(str, old, new, n)) //使用Replace函数替换字符串
}
/*
我是钓鱼城大学的完满主任!
*/

strings.Replace(str, old, new, n)是函数一共有四个参数,str是原字符串,new是需要替换的内容,old是被替换的字符串,n表示匹配到第n个old。如果n等于-1,则表示匹配所有。

统计

  • 出现频率

在strings包中,可以借助strings.Count(str, manyO)统计字符串出现的频率。

func main() {
   
    str := "Golang is cool, right?"
    str1 := "科学建设钓鱼城特色的完满教育!"
    var manyG string = "o"
    
    //使用strings.Count()统计的字符串出现频率
    fmt.Printf("%d\n", strings.Count(str, manyG))
    fmt.Printf("%d\n", strings.Count(str, "oo"))
    fmt.Printf("%d\n", strings.Count(str1, "完满教育"))
}
/* 
3
1
1
*/
  • 字符数量

统计字符串的字符数量可以用两种方法:第一种是使用len([]rune(str)),先把字符串通过[]rune转化,然后再调用len()统计字符串长度。第二种则是通过utf8包中的RuneCountInString函数统计。

func main() {
    str := "一起玩嘛?主任"
    fmt.Printf("%d\n", len([]rune(str)))     //使用len([]rune())方法
    fmt.Println(utf8.RuneCountInString(str)) //使用RuneCountInString()方法
}
/*
7
7
*/

一般来说,Go语言官方更推荐第二种统计方式,但如果只是单纯统计,就没有必要引入utf8包,只需要使用第一种方式即可。以下是代码演示。

大小写转换

使用ToLower将字符串中的Unicode字符全部转换为相应的小写字符
使用ToUpper将字符串中的Unicode字符全部转换为相应的大写字符

func main() {

    str := "Hello World!\n"
    fmt.Printf("%s", str)
    fmt.Printf(strings.ToLower(str)) //使用ToLower将字符串全部转换成小写
    fmt.Printf(strings.ToUpper(str)) //使用ToUpper将字符串全部转换成大写
}
/*
Hello World!
hello world!
HELLO WORLD!
*/

修剪

使用strings.Trim()函数对字符串去掉一些不必要的内容,这一过程被称为修剪。

func main() {

    str := "完满 Hello Go 完满"
    str1 := "          请使用TrimSpace()修剪空白字符       "
    fmt.Println(str)
    fmt.Printf("%q\n", strings.Trim(str, "完满")) //修剪前缀和后缀
    fmt.Printf("%q\n", strings.Trim(str, "完满 "))

    fmt.Printf("%q\n", strings.TrimLeft(str, "完满 "))  //修剪左边前缀的字符
    fmt.Printf("%q\n", strings.TrimRight(str, " 完满")) //修剪右边后缀的字符
    fmt.Printf("%q\n", strings.TrimSpace(str1))       //修剪前缀和后缀的空白字符
}
/* 完满 Hello Go 完满
 " Hello Go "
 "Hello Go"
 "Hello Go 完满"
 "完满 Hello Go"
 "请使用TrimSpace()修剪空白字符"
*/

分割

使用分割函数strings.Split(),函数返回的是一个切片(slice)。切片的形式是用 [ ] 括起来,在后续的复合数据类型中将会进一步学习切片的使用。

func main() {
    str := "This is Golang Project"
    fmt.Println(str)
    fmt.Printf("%q\n", strings.Split(str, "Project")) //分割指定字符
    fmt.Printf("%q\n", strings.Split(str, " "))       //分割空白字符
}
/*
This is Golang Project
["This is Golang " ""]
["This" "is" "Golang" "Project"]
*/

插入字符

strings.Fields函数用于将字符串转换成slice(切片),strings.Join则将类型为string的切片使用分隔符组成拼接组成一个字符串。

func main() {
    str := "What's your name 完满主任"
    strFli := strings.Fields(str) //将原字符串转换成切片类型
    fmt.Println(str)
    fmt.Println(strFli)

    for _, val := range strFli { //range关键字的用法,需补充....
        fmt.Printf("%s", val)
    }
    fmt.Println()
    str2 := strings.Join(strFli, ";") //用分号拼接字符串
    fmt.Printf("%s\n", str2)
}
/*
What's your name 完满主任
[What's your name 完满主任]
What'syourname完满主任
What's;your;name;完满主任
*/

发表评论

电子邮件地址不会被公开。 必填项已用*标注