1.字元串查找
strings是Go内置的标準包,主要用于字元串查找、替換、比較等。常用方法如下:
1.1 方法清單
方法名 | 描述 |
Count(s, substr string)int | 傳回字元串s包含字元串substr的個數 |
Contains(s, substr string)bool | 判斷字元串s是否包含substr字元串 |
ContainsAny(s, chars string)bool | 判斷字元串s是否包含chars字元串中的任意一個字元 |
ContainsRune(s string, r rune)bool | 判斷字元串s是否包含unicode的碼值r |
LastIndex(s, substr string)int | 傳回字元串s中字元串substr最後一次出現的位置 |
Index(s, substr string)int | 傳回字元串s中字元串substr首次出現的位置 |
IndexByte(s string, c byte)int | 傳回字元串s中字元c首次出現的位置 |
IndexRune(s string, r rune)int | 傳回unicode的碼值r在字元串s中首次出現的位置 |
IndexAny(s, chars string)int | 傳回字元串chars中的任意一個字元unicode碼值, 在s中首次出現的位置 |
LastIndexAny(s, chars string)int | 傳回字元串chars中的任意一個字元unicode碼值, 在s中最後一次出現的位置 |
LastIndexByte(s string, c byte)int | 傳回字元串s中字元c最後一次出現的位置 |
HasPrefix(s, prefix string)bool | 判斷字元串s是否有字首prefix |
HasSuffix(s, suffix string)bool | 判斷字元串s是否有字尾suffix |
IndexFunc(s string, f func(r)bool)int | 傳回字元串s中滿足函數f(r)==true, 字元首次出現的位置 |
LastIndexFunc(s string, f func(r)bool)int | 傳回字元串s中滿足函數f(r)==true , 字元最後一次出現的位置 |
1.2 使用示例
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
// 傳回字元串s包含字元串substr的個數
s := "hello word"
fmt.Printf("字元串:%s,o出現數量: %d\n",s,strings.Count(s,"o"))
// 判斷字元串s是否包含substr字元串
fmt.Printf("字元串:%s 是否包含%s ? %t \n",s,"word",strings.Contains(s,"word"))
fmt.Printf("字元串:%s 是否包含%s ? %t \n",s,"go",strings.Contains(s,"go"))
// 判斷字元串s是否包含chars字元串中的任意一個字元
fmt.Printf("字元串:%s 是否包含%s中的任意一個字元 ? %t \n",s,"go",strings.ContainsAny(s,"go"))
fmt.Printf("字元串:%s 是否包含%s中的任意一個字元 ? %t \n",s,"gg",strings.ContainsAny(s,"gg"))
// 判斷字元串s是否包含unicode的碼值r
r := 'w'
fmt.Printf("字元串:%s 是否包含unicode的碼值%c? %t \n",s,r,strings.ContainsRune(s,r))
fmt.Printf("字元串:%s 是否包含unicode的碼值%d? %t \n",s,119,strings.ContainsRune(s,119))
// 傳回字元串s中字元串substr最後一次出現的位置
fmt.Printf("在字元串%s中,字元串%s最後一次出現的位置? %d \n",s,"o",strings.LastIndex(s,"o"))
// 傳回字元串s中字元串substr首次出現的位置
fmt.Printf("在字元串%s中,字元串%s首次出現的位置? %d \n",s,"o",strings.Index(s,"o"))
// 傳回字元串s中字元c首次出現的位置
var b byte = 'l'
fmt.Printf("在字元串%s中,字元%c首次出現的位置? %d \n",s,b,strings.IndexByte(s,b))
// 傳回字元串s中字元c最後一次出現的位置
fmt.Printf("在字元串%s中,字元%c最後一次出現的位置? %d \n",s,b,strings.LastIndexByte(s,b))
// 傳回unicode的碼值r在字元串s中首次出現的位置
fmt.Printf("在字元串%s中,unicode的碼值%d(%c)首次出現的位置? %d \n",s,104,104,strings.IndexRune(s,104))
// 傳回字元串chars中的任意一個字元unicode碼值,在s中首次出現的位置
s3 := "rd"
fmt.Printf("傳回字元串%s中的任意一個字元unicode碼值(%s)首次出現的位置? %d \n",s,s3,strings.LastIndexAny(s,s3))
// 判斷字元串s是否有字首prefix
a := "VIP001"
fmt.Printf("字元串:%s 是否有字首%s ? %t \n",a,"vip",strings.HasPrefix(a,"vip"))
fmt.Printf("字元串:%s 是否有字首%s ? %t \n",a,"VIP",strings.HasPrefix(a,"VIP"))
// 判斷字元串s是否有字尾suffix
sn := "K011_Mn"
fmt.Printf("字元串:%s 是否有字尾%s ? %t \n",sn,"MN",strings.HasSuffix(sn,"MN"))
fmt.Printf("字元串:%s 是否有字尾%s ? %t \n",sn,"Mn",strings.HasSuffix(sn,"Mn"))
// 傳回字元串s中滿足函數f(r)==true,字元首次出現的位置 (判斷第一個漢字的位置)
f := func(c rune) bool {
return unicode.Is(unicode.Han,c)
}
s4 := "go!中國人"
fmt.Printf("字元串:%s 首次出現漢字的位置%d \n",s4,strings.IndexFunc(s4,f))
fmt.Printf("字元串:%s 最後一次出現漢字的位置%d \n",s4,strings.LastIndexFunc(s4,f))
}
/** 輸出
字元串:hello word,o出現數量: 2
字元串:hello word 是否包含word ? true
字元串:hello word 是否包含go ? false
字元串:hello word 是否包含go中的任意一個字元 ? true
字元串:hello word 是否包含gg中的任意一個字元 ? false
字元串:hello word 是否包含unicode的碼值w? true
字元串:hello word 是否包含unicode的碼值119? true
在字元串hello word中,字元串o最後一次出現的位置? 7
在字元串hello word中,字元串o首次出現的位置? 4
在字元串hello word中,字元l首次出現的位置? 2
在字元串hello word中,字元l最後一次出現的位置? 3
在字元串hello word中,unicode的碼值104(h)首次出現的位置? 0
傳回字元串hello word中的任意一個字元unicode碼值(rd)首次出現的位置? 9
字元串:VIP001 是否有字首vip ? false
字元串:VIP001 是否有字首VIP ? true
字元串:K011_Mn 是否有字尾MN ? false
字元串:K011_Mn 是否有字尾Mn ? true
字元串:go!中國人 首次出現漢字的位置3
字元串:go!中國人 最後一次出現漢字的位置9
*/
2. 字元串分割
2.1 方法清單
方法名 | 描述 |
Fields(s string)[]string | 将字元串s以空白字元分割,傳回切片 |
FieldsFunc(s string, f func(r) bool)[]string | 将字元串s以滿足f(r)==true的字元分割, 分割後傳回切片 |
Split(s,sep string)[]string | 将字元串s以sep作為分割符進行分割, 分割後字元最後去掉sep,傳回切片 |
SplitAfter(s,sep string)[]string | 将字元串s以sep作為分割符進行分割, 分割後字元最後加上sep,傳回切片 |
SplitAfterN(s,sep string, n int)[]string | 将字元串s以sep作為分割符進行分割, 分割後字元最後加上sep,n決定分割成切片長度 |
SplitN(s,sep string, n int)[]string | 将字元串s以sep作為分割符進行分割, 分割後字元最後去掉sep,n決定分割成切片長度 |
2.2 使用示例
package main
import (
"fmt"
"strings"
"unicode"
)
func main() {
s := "Go! Go! 中國人!"
// 将字元串s以空白字元分割,傳回切片
slice := strings.Fields(s)
fmt.Printf("将字元串:【%s】以空白字元分割,傳回切片:%v \n",s,slice)
// 将字元串s以滿足f(r)==true的字元分割,分割後傳回切片。
// 以特殊符号分割
f := func(r rune) bool{
// 不是字母,也不是數字
return !unicode.IsLetter(r) && !unicode.IsNumber(r)
}
ss := "張三@19*BeiJing&高中生|男(打球"
slice2 := strings.FieldsFunc(ss,f)
fmt.Printf("将字元串:【%s】 以滿足f(r)==true【不是數字和字母都是分隔符】的字元分割,傳回切片:%v \n",ss,slice2)
// 将字元串s以sep作為分割符進行分割,分割後字元最後去掉sep
s2 := "@123@張@AB@001"
sep1 := "@"
slic1 := strings.Split(s2,sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,分割後最後去掉:%s 傳回切片: %v 切片長度: %d \n",s2,sep1,sep1,slic1,len(slic1))
// 将字元串s以sep作為分割符進行分割,分割後字元最後加上sep,傳回切片
slic2 := strings.SplitAfter(s2,sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,分割後最後加上:%s 傳回切片: %v 切片長度: %d \n",s2,sep1,sep1,slic2,len(slic2))
// 将字元串s以sep作為分割符進行分割,分割後字元最後加上sep,n決定分割成切片長度
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後加上%s \n",s2,sep1,0,strings.SplitAfterN(s2,sep1,0),sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後加上%s \n",s2,sep1,1,strings.SplitAfterN(s2,sep1,1),sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後加上%s \n",s2,sep1,5,strings.SplitAfterN(s2,sep1,5),sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後加上%s \n",s2,sep1,6,strings.SplitAfterN(s2,sep1,6),sep1)
// 将字元串s以sep作為分割符進行分割,分割後字元最後去掉sep,n決定分割成切片長度
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後去掉%s \n",s2,sep1,1,strings.SplitN(s2,sep1,1),sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後去掉%s \n",s2,sep1,3,strings.SplitN(s2,sep1,3),sep1)
fmt.Printf("将字元串:【%s】以%s進行分割,指定分割切片長度%d: %v 分割後去掉%s \n",s2,sep1,5,strings.SplitN(s2,sep1,5),sep1)
}
/** 輸出
将字元串:【Go! Go! 中國人!】以空白字元分割,傳回切片:[Go! Go! 中國人!]
将字元串:【張三@19*BeiJing&高中生|男(打球】 以滿足f(r)==true【不是數字和字母都是分隔符】的字元分割,傳回切片:[張三 19 BeiJing 高中生 男 打球]
将字元串:【@123@張@AB@001】以@進行分割,分割後最後去掉:@ 傳回切片: [ 123 張 AB 001] 切片長度: 5
将字元串:【@123@張@AB@001】以@進行分割,分割後最後加上:@ 傳回切片: [@ 123@ 張@ AB@ 001] 切片長度: 5
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度0: [] 分割後加上@
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度1: [@123@張@AB@001] 分割後加上@
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度5: [@ 123@ 張@ AB@ 001] 分割後加上@
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度6: [@ 123@ 張@ AB@ 001] 分割後加上@
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度1: [@123@張@AB@001] 分割後去掉@
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度3: [ 123 張@AB@001] 分割後去掉@
将字元串:【@123@張@AB@001】以@進行分割,指定分割切片長度5: [ 123 張 AB 001] 分割後去掉@
*/
3.大小寫切換
3.1 方法清單
方法名 | 描述 |
Title(s string)string | 将字元串s每個單詞首字母大寫 |
ToLower(s string)string | 将字元串s轉換成小寫傳回 |
ToLowerSpecial(c unicode.SpecialCase,s string)string | 将字元串s中所有字元串按c指定的 映射轉換成小寫傳回 |
ToTitle(s string)string | 将字元串s轉換成大寫傳回 |
ToTitleSpecial(c unicode.SpecialCase,s string) string | 将字元串s中所有的字元按c指定的 映射轉換成大寫傳回 |
ToUpper(s string)string | 将字元串s轉換成大寫傳回 |
ToUpperSpecial(c unicode.SpecialCase,s string) string | 将字元串s中所有的字元按c指定的 映射轉換成大寫傳回 |
3.2 使用示例
package main
import (
"fmt"
"strings"
)
func main() {
str := "hello word"
str1 := "HELLO WORD"
// Title(s string) string: 每個單詞首字母大寫
fmt.Printf("Title->将字元串%s 每個單詞首字母大寫: %s\n",str,strings.Title(str))
// ToLower(s string) string : 将字元串s轉換成小寫傳回
fmt.Printf("ToLower->将字元串%s 轉換成小寫傳回: %s\n",str1,strings.ToLower(str1))
// ToTitle(s string)string: 将字元串s轉換成大寫傳回
fmt.Printf("ToTitle->将字元串%s 轉換成大寫傳回: %s\n",str,strings.ToTitle(str))
// ToUpper(s string)string: 将字元串s轉換成大寫傳回
fmt.Printf("ToUpper->将字元串%s 轉換成大寫傳回: %s\n",str,strings.ToUpper(str))
}
/**輸出
Title->将字元串hello word 每個單詞首字母大寫: Hello Word
ToLower->将字元串HELLO WORD 轉換成小寫傳回: hello word
ToTitle->将字元串hello word 轉換成大寫傳回: HELLO WORD
ToUpper->将字元串hello word 轉換成大寫傳回: HELLO WORD
*/
3.3 ToTitle和ToUpper的差別
大部分情況下, ToUpper 與 ToTitle 傳回值相同,但在處理某些unicode編碼字元則不同,示例如下:
package main
import (
"fmt"
"strings"
)
func main() {
strr := "dz ǵǵdzdzdz hello world!"
fmt.Printf("ToTitle->将字元串%s 轉換成大寫傳回: %s\n",strr,strings.ToTitle(strr))
// ToUpper(s string)string: 将字元串s轉換成大寫傳回
fmt.Printf("ToUpper->将字元串%s 轉換成大寫傳回: %s\n",strr,strings.ToUpper(strr))
}
/** 輸出
ToTitle->将字元串dz ǵǵdzdzdz hello world! 轉換成大寫傳回: Dz ǴǴDzDzDz HELLO WORLD!
ToUpper->将字元串dz ǵǵdzdzdz hello world! 轉換成大寫傳回: DZ ǴǴDZDZDZ HELLO WORLD!
*/
4.字元串删除
4.1 方法清單
方法名 | 描述 |
Trim(s,cutset string)string | 将字元串s首尾包含在cutset中的任一字元去掉 |
TrimFunc(s string,f func(r)bool)string | 将字元串s首尾滿足函數f(r)==true的字元串去掉 |
TrimLeft(s,cutset string)string | 将字元串s左邊包含在cutset中的任一字元去掉 |
TrimLeftFunc(s string,f func(r)bool) string | 将字元串s左邊滿足函數f(r)==true的字元串去掉 |
TrimPrefix(s,prefix string)string | 将字元串s中字首字元串prefix去掉 |
TrimRight(s,cutset string) string | 将字元串s右邊包含在cutset中的任一字元去掉 |
TrimRightFunc(s string, f func(r) bool) string | 将字元串s右邊滿足函數f(r)==true的字元串去掉 |
TrimSpace(s string) string | 将字元串首尾空白去掉 |
TrimSuffix(s, suffix string) string | 将字元串s中字尾字元串suffix去掉 |
4.2 使用示例
package main
import (
"fmt"
"strings"
)
func main() {
// 将字元串首尾包含在cutset中的任一字元去掉
str := "@*test@-@124@!*"
cutset := "*#@!"
fmt.Printf("将字元串【%s】首尾包含在【%s】中的任一字元去掉,傳回:【%s】\n",str,cutset,strings.Trim(str,cutset))
// 将字元串首尾滿足函數`f(r)==true`的字元串去掉
f := func(r rune) bool {
if strings.Contains("*#@!",string(r)) {
return true
}
return false
}
fmt.Printf("将字元串【%s】首尾滿足函數f的字元去掉,傳回:【%s】\n",str,strings.TrimFunc(str,f))
// 将字元串左邊包含在cutset中的任一字元去掉
fmt.Printf("将字元串【%s】左邊包含在【%s】中的任一字元去掉,傳回:【%s】\n",str,cutset,strings.TrimLeft(str,cutset))
// 将字元串左邊滿足函數`f(r)==true`的字元串去掉
fmt.Printf("将字元串【%s】左邊滿足函數f的字元去掉,傳回:【%s】\n",str,strings.TrimLeftFunc(str,f))
// 将字元串右邊包含在cutset中的任一字元去掉
fmt.Printf("将字元串【%s】右邊包含在【%s】中的任一字元去掉,傳回:【%s】\n",str,cutset,strings.TrimRight(str,cutset))
fmt.Printf("将字元串【%s】右邊滿足函數f的字元去掉,傳回:【%s】\n",str,strings.TrimRightFunc(str,f))
// 将字元串中字首字元串prefix去掉
str1 := "VIP00001_U"
fmt.Printf("将字元串【%s】字首【%s】去掉,傳回:【%s】\n",str1,"VIP",strings.TrimPrefix(str1,"VIP"))
fmt.Printf("将字元串【%s】字首【%s】去掉,傳回:【%s】\n",str1,"vip",strings.TrimPrefix(str1,"vip"))
// 将字元串中字尾字元串suffix去掉
fmt.Printf("将字元串【%s】字尾【%s】去掉,傳回:【%s】\n",str1,"U",strings.TrimSuffix(str1,"U"))
fmt.Printf("将字元串【%s】字尾【%s】去掉,傳回:【%s】\n",str1,"u",strings.TrimSuffix(str1,"u"))
// 将字元串首尾空白去掉
str2 := " hello word ! "
fmt.Printf("将字元串【%s】首尾空白去掉,傳回:【%s】\n",str2,strings.TrimSpace(str2))
}
/**輸出
将字元串【@*test@-@124@!*】首尾包含在【*#@!】中的任一字元去掉,傳回:【test@-@124】
将字元串【@*test@-@124@!*】首尾滿足函數f的字元去掉,傳回:【test@-@124】
将字元串【@*test@-@124@!*】左邊包含在【*#@!】中的任一字元去掉,傳回:【test@-@124@!*】
将字元串【@*test@-@124@!*】左邊滿足函數f的字元去掉,傳回:【test@-@124@!*】
将字元串【@*test@-@124@!*】右邊包含在【*#@!】中的任一字元去掉,傳回:【@*test@-@124】
将字元串【@*test@-@124@!*】右邊滿足函數f的字元去掉,傳回:【@*test@-@124】
将字元串【VIP00001_U】字首【VIP】去掉,傳回:【00001_U】
将字元串【VIP00001_U】字首【vip】去掉,傳回:【VIP00001_U】
将字元串【VIP00001_U】字尾【U】去掉,傳回:【VIP00001_】
将字元串【VIP00001_U】字尾【u】去掉,傳回:【VIP00001_U】
将字元串【 hello word ! 】首尾空白去掉,傳回:【hello word !】
*/
5.拼接和重複
5.1 方法清單
方法名 | 描述 |
Join(elems []string, sep string) string | 将字元串切片elems,使用sep進行拼接 |
Repeat(s string, count int) string | 将字元串s,重複count次 |
5.3 使用示例
package main
import (
"fmt"
"strings"
)
func main() {
// 字元串拼接
fmt.Printf("字元串拼接:Join-> %s\n",strings.Join([]string{"a","b","c"},"|"))
// 字元串重複
fmt.Printf("字元串重複:Repeat-> %s\n",strings.Repeat("Go!",10))
}
/**輸出
字元串拼接:Join-> a|b|c
字元串重複:Repeat-> Go!Go!Go!Go!Go!Go!Go!Go!Go!Go!
*/
6.字元串替換
6.1 方法清單
方法名 | 描述 |
Replace(s, old, new string, n int)string | 将字元串s前n個不重疊old子串都替換為new的新字元串 如果n<0會替換所有old子串。 |
ReplaceAll(s, old, new string) string | 将字元串s中的old子串全部替換為new的新字元串 |
6.2 使用示例
package main
import (
"fmt"
"strings"
)
func main() {
// 字元串替換,如果n<0會替換所有old子串。
s := "a,b,c,d,e,f"
old := ","
newStr := "."
fmt.Printf("将字元串【%s】中的前%d個【%s】替換為【%s】結果是【%s】\n",s,2,old,newStr,strings.Replace(s,old,newStr,2))
fmt.Printf("将字元串【%s】中的前%d個【%s】替換為【%s】結果是【%s】\n",s,7,old,newStr,strings.Replace(s,old,newStr,7))
fmt.Printf("将字元串【%s】中的前%d個【%s】替換為【%s】結果是【%s】\n",s,-1,old,newStr,strings.Replace(s,old,newStr,-1))
// 字元串全部替換
fmt.Printf("将字元串【%s】中的【%s】全部替換為【%s】結果是【%s】\n",s,old,newStr,strings.ReplaceAll(s,old,newStr))
}
/**輸出
将字元串【a,b,c,d,e,f】中的前2個【,】替換為【.】結果是【a.b.c,d,e,f】
将字元串【a,b,c,d,e,f】中的前7個【,】替換為【.】結果是【a.b.c.d.e.f】
将字元串【a,b,c,d,e,f】中的前-1個【,】替換為【.】結果是【a.b.c.d.e.f】
将字元串【a,b,c,d,e,f】中的【,】全部替換為【.】結果是【a.b.c.d.e.f】
*/
7.字元串比較
7.1 方法清單
方法名 | 描述 |
Compare(a, b string) int | 按字典順序比較a和b字元串的大小 如果 a > b,傳回一個大于 0 的數 如果 a == b,傳回 0 如果 a < b,傳回一個小于 0 的數 |
EqualFold(s, t string) bool | 判斷s和t兩個UTF-8字元串是否相等,忽略大小寫 |
7.1 使用示例
package main
import (
"fmt"
"strings"
)
func main() {
// 字元串比較大小
s := "a"
s1 := "c"
s2 := "c"
fmt.Printf("%s > %s 傳回 : %d \n",s,s1,strings.Compare(s,s1))
fmt.Printf("%s > %s 傳回 : %d \n",s1,s,strings.Compare(s1,s))
fmt.Printf("%s > %s 傳回 : %d \n",s1,s2,strings.Compare(s1,s2))
// 字元串比較一緻性
a := "go"
b := "Go"
c := "go"
fmt.Printf("%s和%s是否相等(忽略大小寫)?%t \n",a,b,strings.EqualFold(a,b))
fmt.Printf("%s和%s是否相等(忽略大小寫)?%t \n",a,c,strings.EqualFold(a,c))
fmt.Printf("%s和%s是否相等(不忽略大小寫)?%t \n",a,b,a == b)
fmt.Printf("%s和%s是否相等(不忽略大小寫)?%t \n",a,c,a == c)
}
/**輸出
a > c 傳回 : -1
c > a 傳回 : 1
c > c 傳回 : 0
go和Go是否相等(忽略大小寫)?true
go和go是否相等(忽略大小寫)?true
go和Go是否相等(不忽略大小寫)?false
go和go是否相等(不忽略大小寫)?true
*/
微信搜尋關注【猿碼記】檢視更多文章。