字符串處理
字符串在開發中經常用到,包括用戶的輸入,數據庫讀取的數據等,我們經常需要對字符串進行分割、連接、轉換等操作
字符串操作
下面這些函數來自於strings包,這里介紹一些我平常經常用到的函數,更詳細的請參考官方的文檔。
1.前綴和后綴
HasPrefix 判斷字符串s是否以prefix開頭:
函數簽名
strings.HasPrefix(s, prefix string) bool
HasSuffix 判斷字符串 s 是否以 suffix 結尾:
函數簽名
strings.HasSuffix(s, suffix string) bool
示例:
package main
import (
"fmt"
"strings"
)
func main(){
str1 := "this is a example strings"
fmt.Println(strings.HasPrefix(str1, "th"))
fmt.Println(strings.HasSuffix(str1, "gs"))
}
Contains 字符串包含關系
func Contains(s, substr string) bool
- 功能:字符串s中是否包含substr,返回bool值
示例代碼:
fmt.Println(strings.Contains("seafood", "foo"))
fmt.Println(strings.Contains("seafood", "bar"))
fmt.Println(strings.Contains("seafood", ""))
fmt.Println(strings.Contains("", ""))
//運行結果:
//true
//false
//true
//true
Join(拼接slice到字符串)
Join 用於將元素類型為 string 的 slice 使用分割符號來拼接組成一個字符串
函數簽名
strings.Join(sl []string, sep string) string
舉例:
示例1:
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ","))
示例2:
package main
import (
"fmt"
"strings"
)
func main() {
str1 := "hello world python golang"
field := strings.Fields(str1)
fmt.Printf("%q\n", field)
split := strings.Split(str1, " ")
fmt.Printf("%q\n", split)
join := strings.Join(split, ";")
fmt.Println(join)
}
Index、LastIndex、IndexRune
功能:在字符串s中查找sep所在的位置,返回位置值,找不到返回-1
語法:
strings.Index(s, str string) int
LastIndex 返回字符串 str 在字符串 s 中最后出現位置的索引(str 的第一個字符的索引),-1 表示字符串 s 不包含字符串 str:
strings.LastIndex(s, str string) int
示例代碼:
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
//運行結果:
// 4
// -1
如果需要查詢非 ASCII 編碼的字符在父字符串中的位置,建議使用以下函數來對字符進行定位:
strings.IndexRune(s string, r rune) int
var c string = "Hi I am Hello world"
fmt.Println(strings.IndexRune(c, rune('a')))
fmt.Println(strings.IndexRune(c, 97))
Count
Count 用於計算字符串 str 在字符串 s 中出現的非重疊次數:
strings.Count(s, str string) int
舉例:
str2 := "fffffff"
fmt.Println(strings.Count(str2,"f"))
Repeat
func Repeat(s string, count int) string
功能:重復s字符串count次,並返回一個新的字符串
示例代碼:
var orgiS string = "Hi there! "
news := strings.Repeat(orgiS, 3) // Hi there! Hi there! Hi there!
fmt.Printf("news str is: %s\n", news)
Replace (字符串替換)
func Replace(s, old, new string, n int) string
功能:在s字符串中,把old字符串替換為new字符串,n表示替換的次數,小於0表示全部替換
示例代碼:
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
//運行結果:
//oinky oinky oink
//moo moo moo
ToLower,ToUpper(修改字符串的大小寫)
ToLower 將字符串中的 Unicode 字符全部轉換為相應的小寫字符:
函數簽名
strings.ToLower(s) string
ToUpper 將字符串中的 Unicode 字符全部轉換為相應的大寫字符:
函數簽名
strings.ToUpper(s) string
舉例:
package main
import (
"fmt"
"strings"
)
func main() {
var str1 = "go how are you"
lower := strings.ToLower(str1)
fmt.Println(lower)
upper := strings.ToUpper(str1)
fmt.Println(upper)
}
Split,Fields(分割字符串)
strings.Fields(s) 將會利用 1 個或多個空白符號來作為動態長度的分隔符將字符串分割成若干小塊,並返回一個 slice,如果字符串只包含空白符號,則返回一個長度為 0 的 slice。
strings.Split(s, sep) 用於自定義分割符號來對指定字符串進行分割,同樣返回 slice
func Split(s, sep string) []string
功能:把s字符串按照sep分割,返回slice
示例代碼:
package main
import (
"fmt"
"strings"
)
func main() {
str1 := "Hello, golang, world,python"
field := strings.Fields(str1)
fmt.Printf("%q\n", field) // ["Hello," "golang," "world,python"]
split := strings.Split(str1, ",")
fmt.Printf("%q\n", split) // ["Hello" " golang" " world" "python"]
}
Trim Trimleft TrimRight
func Trim(s string, cutset string) string
功能:在s字符串的頭部和尾部去除cutset指定的字符串
示例代碼:
fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))
//運行結果:["Achtung"]
Map
將s的每一個unicode碼值r都替換為mapping(r),返回這些新碼值組成的字符串拷貝。如果mapping返回一個負值,將會丟棄該碼值而不會被替換
示例代碼:
package main
import (
"fmt"
"strings"
)
func main() {
mapFunc := func(r rune) rune {
switch {
case r > 'A' && r < 'Z':
return r + 32
case r > 'a' && r < 'z':
return r - 32
}
return r
}
s := "hello World!"
sMap := strings.Map(mapFunc, s)
fmt.Println(sMap)
}
NewReader(從字符串中讀取內容)
函數 strings.NewReader(str) 用於生成一個 Reader 並讀取字符串中的內容,然后返回指向該 Reader 的指針,從其它類型讀取內容的函數還有:
Read() 從 []byte 中讀取內容。
ReadByte() 和 ReadRune() 從字符串中讀取下一個 byte 或者 rune。
參考:https://blog.csdn.net/sanxiaxugang/article/details/60324012
Reader 結構體
Reader 類型從一個字符串讀取數據,實現了io.Reader, io.Seeker等接口。
func NewReader(s string) *Reader // 通過字符串 s 創建一個 Reader
func (r *Reader) Len() int // 返回 r 還沒有讀取部分的長度
func (r *Reader) Read(b []byte) (n int, err error) // 讀取部分數據到 b 中,讀取的長度取決於 b 的容量
func (r *Reader) ReadByte() (b byte, err error) // 從 r 中讀取一字節數據
示例代碼:
package main
import (
"fmt"
"strings"
)
func main() {
s := "hello world"
r := strings.NewReader(s)
fmt.Println(r) // &{hello world 0 -1}
fmt.Println(r.Size()) // 字符串長度 11
fmt.Println(r.Len()) // 未讀取長度 11
for r.Len() > 5 {
b, err := r.ReadByte() // 讀取1byte
fmt.Println(string(b), err, r.Len(), r.Size())
// h <nil> 10 11
// e <nil> 9 11
// l <nil> 8 11
// l <nil> 7 11
// o <nil> 6 11
// <nil> 5 11
}
// 讀取還未被讀取字符串中5字符的數據
remainStr := make([]byte, 5)
n, err := r.Read(remainStr)
fmt.Println(string(remainStr), n, err) // world 5 <nil>
fmt.Println(r.Size()) // 11
fmt.Println(r.Len()) // 0
}
Replacer 結構體
Replacer 類型實現字符串替換的操作
func NewReplacer(oldnew ...string) *Replacer // 使用提供的多組old、new字符串對創建一個*Replacer
func (r *Replacer) Replace(s string) string // 返回s 所有替換完后的拷貝
func (r *Replacer) WriteString(w io.Writer, s string) (n int, err error) // 向w中寫入s替換完后的拷貝
參考: