天天看點

Go推薦包「二」: strings

作者:猿碼記

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 
*/
           

微信搜尋關注【猿碼記】檢視更多文章。