您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Golang怎么分割字符串”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Golang怎么分割字符串”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
ss := strings.Fields(s)
示例:
package main import ( "fmt" "strings" ) func main() { fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz ")) }
輸出:
Fields are: ["foo" "bar" "baz"]
ss := strings.Split(s, sep)
可以指定一個(gè)字符串作為分隔符,可以指定單個(gè)字符作為分隔符,因?yàn)閱蝹€(gè)字符也是一個(gè)字符串。
示例:
package main import ( "fmt" "strings" ) func main() { 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("", ",")) }
輸出:
["a" "b" "c"]
["" "man " "plan " "canal panama"]
[" " "x" "y" "z" " "]
[""]
注意,如果待分割串為空串,strings.Split 將返回包含一個(gè)空串的切片。
如果希望返回 nil 切片,可以做一下封裝。
func Split(s, sep string) []string { if s == "" { return nil } return strings.Split(s, sep) }
標(biāo)準(zhǔn)庫 strings 包中有一個(gè)函數(shù) FieldsFunc 可以指定多個(gè)字符為分隔符。
ss := strings.FieldsFunc(s,f func(rune) bool)
示例:
package main import ( "fmt" "strings" "unicode" ) func main() { f := func(c rune) bool { return !unicode.IsLetter(c) && !unicode.IsNumber(c) } fmt.Printf("Fields are: %q", strings.FieldsFunc(" foo1;bar2,baz3...", f)) }
輸出:
Fields are: ["foo1" "bar2" "baz3"]
截至 Go 1.20,標(biāo)準(zhǔn)庫暫未供支持多個(gè)字符串作為分隔符的分割函數(shù)。但是,我們可以基于 strings.Split 編寫一個(gè)函數(shù)來實(shí)現(xiàn)這個(gè)功能。
// SplitSeps splits string into substring slice by multiple string separators. // If you want to specify multiple string separators by regexp, // please refer to `func (*Regexp) Split` in standard library regexp package. func SplitSeps(s string, seps ...string) []string { if len(seps) == 0 { return []string{s} } result := strings.Split(s, seps[0]) for _, sep := range seps[1:] { var temp []string for _, r := range result { temp = append(temp, strings.Split(r, sep)...) } result = temp } return result }
示例:
package main import ( "fmt" "strings" ) func main() { fmt.Printf("%q\n", SplitSeps("foo,bar,baz", []string{","}...)) fmt.Printf("%q\n", SplitSeps("foo,bar|baz", []string{",", "|"}...)) fmt.Printf("%q\n", SplitSeps("foo,bar|baz qux", []string{",", "|", " "}...)) fmt.Printf("%q\n", SplitSeps("foo,bar|bazSEPqux", []string{",", "|", "SEP"}...)) fmt.Printf("%q\n", SplitSeps("foo,bar|baz", []string{}...)) fmt.Printf("%q\n", SplitSeps(" xyz", []string{""}...)) }
輸出:
["foo" "bar" "baz"]
["foo" "bar" "baz"]
["foo" "bar" "baz" "qux"]
["foo" "bar" "baz" "qux"]
["foo,bar|baz"]
[" " "x" "y" "z"]
除了文中提及的標(biāo)準(zhǔn)庫函數(shù),你可能還會(huì)用到下面這幾個(gè)函數(shù)來控制字符串的分割方式。
strings.SplitN
func strings.SplitN(s, sep string, n int) []string
該函數(shù)與 Split 函數(shù)類似,但是可以指定分割后的最大子字符串個(gè)數(shù) n,如果 n 為正數(shù),則最多分割成 n 個(gè)子字符串;如果 n 為負(fù)數(shù),則不限制子字符串個(gè)數(shù)。例如:
str := "hello,world,how,are,you" words := strings.SplitN(str, ",", 2) fmt.Println(words) // ["hello", "world,how,are,you"]
strings.SplitAfter
func SplitAfter(s, sep string) []string
該函數(shù)將字符串 s 按照分割符 sep 分割成多個(gè)子字符串,并返回一個(gè)字符串切片。不同于 Split 函數(shù)的是,SplitAfter 函數(shù)會(huì)在分割符之后分割,例如:
str := "hello,world,how,are,you" words := strings.SplitAfter(str, ",") fmt.Println(words) // ["hello,", "world,", "how,", "are,", "you"]
strings.SplitAfterN
func SplitAfterN(s, sep string, n int) []string
該函數(shù)與 SplitAfter 函數(shù)類似,但是可以指定分割后的最大子字符串個(gè)數(shù) n。如果 n 為負(fù)數(shù),則不限制子字符串個(gè)數(shù)。例如:
str := "hello,world,how,are,you" words := strings.SplitAfterN(str, ",", 2) fmt.Println(words) // ["hello,", "world,how,are,you"]
借助 Golang 標(biāo)準(zhǔn)庫提供的相關(guān)函數(shù),分割字符串還是比較方便的。
文中提及的兩個(gè)函數(shù),已放置 Github 開源工具庫 go-huge-util,大家可使用 go mod 方式 import 然后使用。
import "github.com/dablelv/go-huge-util/str" // Split 如果待分割串為空串,返回 nil 切片而非包含一個(gè)空串的切片。 str.Split(s, sep string) []string // SplitSeps 通過多個(gè)字符串分隔符將字符串分割為字符串切片。 str.SplitSeps(s string, seps []string) []string
go-huge-util 除了類型轉(zhuǎn)換,還有很多其他實(shí)用函數(shù),如加解密、zip 解壓縮等,歡迎大家使用、Star、Issue 和 Pull Request。
讀到這里,這篇“Golang怎么分割字符串”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。