1. 程式人生 > 其它 >go基礎:字串操作

go基礎:字串操作

技術標籤:gogostrings

一、簡介

字串是在程式設計中一個非常常見的操作,熟悉語言的自帶的字串操作函式能幫助你寫出優雅、高效的程式碼,所以語言中自帶的字串處理函式,大家應該熟練掌握。go中主要操作字元的包是strings,下面就介紹一下go中字串的相關操作包和工程中使用最多的字串操作函式示例。

二、編碼

1.包含操作,strings中的包含操作主要有兩個
func Contains(s, substr string) bool
func ContainsAny(s, chars string) bool

contains函式,當s中包含substr時返回true,測試程式碼如下:

fmt.Println(strings.Contains("我是中國人", "中國"))
fmt.Println(strings.Contains("seefood", "foo"))
fmt.Println(strings.Contains("seefood", "fo o"))
fmt.Println(strings.Contains("seefood", "sea"))
fmt.Println(strings.Contains(
"seefood", "")) fmt.Println(strings.Contains("", ""))

輸出結果如下:

true
true
false
false
true
true

從上面測試我們需注意一下幾點:

  • 函式的兩個引數可以傳入empty(就是最後一個用例)
  • 當函式的第二個引數為empty時,前面的字串為任意值,返回結果都是true
  • 子串需是連續的
  • 中文支援良好

ContainsAny函式:如果任何Unicode字元碼位在s內,ContainsAny返回true。測試例項如下:

fmt.Println(
strings.ContainsAny("我是中國人", "人民")) fmt.Println(strings.ContainsAny("team", "i")) fmt.Println(strings.ContainsAny("failure", "ui")) fmt.Println(strings.ContainsAny("failure", "te")) fmt.Println(strings.ContainsAny("failure", "發")) fmt.Println(strings.ContainsAny("foo", "")) fmt.Println(strings.ContainsAny("", ""))

測試函式輸出如下:

true
false
true
true
false
false
false

這個函式我們注意一下幾點:

  • 當chars引數為empty時,函式永遠返回false
  • 對中文支援良好
  • 在s中包含任意一個chars中的字元時,函式都返回true
2.計數函式
func Count(s, sep string) int

Count計數函式:Count計算s中sep的不重疊例項的數量。測試程式碼如下:

fmt.Println(strings.Count("cheese", "e"))
fmt.Println(strings.Count("five", ""))
fmt.Println(strings.Count("我是中國人", "中"))
fmt.Println(strings.Count("我是中國人", "人民"))
fmt.Println(strings.Count("我是中國人", ""))
fmt.Println(strings.Count("", ""))

例項結果如下:

3
5
1
0
6
1

這個函式我們注意以下幾點:

  • 在sep為empty時,返回前面子串的長度加1
  • 中文不受影響,返回的是中文的個數
  • sep需和s進行連續匹配
3.忽略大小寫等於
func EqualFold(s, t string) bool

EqualFold函式:是一個忽略大小寫的比較函式,官方文件上面說:s和t解釋為utf-8編碼,在Unicode下進行忽略大小寫判斷.

fmt.Println(strings.EqualFold("golang", "GOLANG"))
fmt.Println(strings.EqualFold("go", "lang"))
fmt.Println(strings.EqualFold("go", "go"))
fmt.Println(strings.EqualFold("go", ""))
fmt.Println(strings.EqualFold("", ""))

測試結果如下:

true
false
true
false
true

這個函式需要注意:

  • 引數可以是empty,empty可以進行比較
4.字串分割
func Fields(s string) []string
func Split(s, sep string) []string
func SplitAfter(s, sep string) []string
func SplitAfterN(s, sep string, n int) []string
func SplitN(s, sep string, n int) []string

Fields函式是按照空格進行分割,測試用例如下:

fmt.Printf("Fields are: %q", strings.Fields("  wo are family    "))	

測試結果如下:

Fields are: [“wo” “are” “family”]

Split字串分割函式,按照指定的字元進行字串分割,測試用例如下:

fmt.Printf("%q\n", strings.Split("我是中國人", "中國"))
fmt.Printf("%q\n", strings.Split("a,b,c", ","))
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))
fmt.Printf("%q\n", strings.Split(" xyz ", ""))
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))

測試結果如下:

[“我是” “人”]
[“a” “b” “c”]
["" “man " “plan " “canal panama”]
[” " “x” “y” “z” " “]
[””]

這個函式有以下幾點需要注意:

  • 中文可分割
  • 會匹配s中的所有分割符號
  • 可用empty對字串進行分割,分割結果為將每個字元進行分割

SplitAfter函式會保留分割符

fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ","))
fmt.Printf("%q\n", strings.SplitAfter("我是中國人", "中國"))

輸入結果如下:

[“a,” “b,” “c”]
[“我是中國” “人”]

SplitAfterN函式可以控制返回陣列的長度

fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 1))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 2))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 3))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 4))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 5))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 6))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 0))
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", -1))

測試結果如下:

[“a,b,c,d,e”]
[“a,” “b,c,d,e”]
[“a,” “b,” “c,d,e”]
[“a,” “b,” “c,” “d,e”]
[“a,” “b,” “c,” “d,” “e”]
[“a,” “b,” “c,” “d,” “e”]
[]
[“a,” “b,” “c,” “d,” “e”]

Tips:

  • n>0:最多n個子串;最後一個子串將是剩餘為拆分的串;
  • n==0:返回空
  • n<0:所有分割子串

SplitN函式:和上面的SplitAfterN類似,但是會剔除分隔符,測試例項如下:

fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 1))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 2))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 3))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 4))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 5))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 6))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 7))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 8))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", 0))
fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e,f,g", ",", -1))

例項測試結果如下:

[“a,b,c,d,e,f,g”]
[“a” “b,c,d,e,f,g”]
[“a” “b” “c,d,e,f,g”]
[“a” “b” “c” “d,e,f,g”]
[“a” “b” “c” “d” “e,f,g”]
[“a” “b” “c” “d” “e” “f,g”]
[“a” “b” “c” “d” “e” “f” “g”]
[“a” “b” “c” “d” “e” “f” “g”]
[]
[“a” “b” “c” “d” “e” “f” “g”]

5.子串索引
func Index(s, sep string) int

Index函式返回sep在s中索引的位置,如果存在就返回大於等於0的數,如果不存在返回-1,測試用例如下:

fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
fmt.Println(strings.Index("愛喝水的社長", "水"))
fmt.Println(strings.Index("愛喝水的社長", "愛"))
fmt.Println(strings.Index("愛喝水的社長", "喝"))
fmt.Println("中文長度:", len("中"))

測試結果如下:

4
-1
6
0
3
中文長度: 3

大家看,後面的中文是不是有點奇怪,這個我個人認為是中文在go中佔用了3個位元組的原因~

func IndexRune(s string, r rune) int

這個函式是單個字元的索引函式,測試用例如下:

fmt.Println(strings.IndexRune("food", 'o'))
fmt.Println(strings.IndexRune("愛喝水的社長", '水'))
fmt.Println(strings.IndexRune("愛喝水的社長", '愛'))
fmt.Println(strings.IndexRune("愛喝水的社長", '喝'))
fmt.Println(strings.IndexRune("愛shang喝水的社長", 'h'))

測試結果如下:

1
6
0
3
4

在使用中文的時候,中文也是佔3個字元~

func LastIndex(s, sep string) int

LastIndex是從後往前找,找到的第一個匹配的字元的索引,測試程式碼如下:

fmt.Println(strings.Index("go gopher", "go"))
fmt.Println(strings.LastIndex("go gopher", "go"))
fmt.Println(strings.LastIndex("go gopher", "rodent"))
fmt.Println(strings.LastIndex("愛喝水的社長社長", "社長"))

測試輸出如下:

0
3
-1
18

6.連線函式
func Join(a []string, sep string) string

這個函式可以將字串陣列組合為一個字串,測試用例如下:

fmt.Println(strings.Join([]string{"123", "234", "345"}, "喝水"))
fmt.Println(strings.Join([]string{"社長", "愛喝水", "。"}, ""))

測試結果如下:

123喝水234喝水345
社長愛喝水。

7.替換函式
func Replace(s, old, new string, n int) string

這個函式可以替換s中的某個字元,測試程式碼如下:

fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
fmt.Println(strings.Replace("社長愛喝水", "水", "涼白開", -1))

測試結果如下:

oinky oinky oink
moo moo moo
社長愛喝涼白開

8.大小寫轉換
func ToLower(s string) string
func ToUpper(s string) string

ToLower函式將字串轉化為小寫,測試程式碼如下:

fmt.Println(strings.ToLower("社長喝水ING"))

測試結果如下:

社長喝水ing

ToUpper函式是將字串轉換為大寫,測試程式碼如下:

fmt.Println(strings.ToUpper("社長喝水ing"))

測試程式碼如下:

社長喝水ING

9.字串前後的字元去除

我們在開發的時候,我們都對字串前面或者後面的空格進行去除,在go中有兩個函式可以使用

func Trim(s string, cutset string) string
func TrimSpace(s string) string

Trim函式可以去除字串開始或者結尾的特定字元,測試程式碼如下:

fmt.Printf("[%q]\n", strings.Trim(" !!! Achtung !!! ", "! "))

測試結果如下:

[“Achtung”]

TrimSpace函式是去除字串的開始的空格換行符,測試程式碼如下:

fmt.Printf("%#v\n", strings.TrimSpace(" \t\n a lone gopher \n\t\r\n"))

測試結果如下:

“a lone gopher”

相同的內容在下面的公眾號中也有釋出,每天分享一些程式設計知識與技巧,感興趣的朋友可以加關注,感謝支援!!在這裡插入圖片描述