39

Golang 标准库:strings 包的应用

 3 years ago
source link: https://studygolang.com/articles/29100
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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;完满主任
*/

欢迎关注我们的微信公众号,每天学习Go知识

FveQFjN.jpg!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK