package main
import (
"fmt"
"unicode"
"strings"
)
func main() {
//是否存在某个字符串
str := "a has a b"
subStr := "a"
subAny := "ab"
fmt.Println("contains:%t", strings.Contains(str, subStr))
fmt.Println("containsAny:%t", strings.ContainsAny(str, subAny))
fmt.Println(strings.ContainsAny("team", "i"))
fmt.Println(strings.ContainsAny("faiulure", "u & i"))
fmt.Println(strings.ContainsAny("in failure", "s g"))
fmt.Println(strings.ContainsAny("foo", ""))
fmt.Println(strings.ContainsAny("", ""))
// 字符串匹配 Count
fmt.Println(strings.Count("five", ""))
fmt.Println(strings.Count("fivevev", "vev"))
//字符串分割 []string
//该包提供了六个三组分割函数:Fields 和 FieldsFunc、Split 和 SplitAfter、SplitN 和 SplitAfterN。
fmt.Printf("Fields are :%q", strings.Fields(" foo bar baz "))
//FieldsFunc 用这样的Unicode代码点 c 进行分隔:满足 f(c) 返回 true。该函数返回[]string。如果字符串 s 中所有的代码点(unicode code points)都满足f(c)或者 s 是空,则 FieldsFunc 返回空slice。
fmt.Println(strings.FieldsFunc(" foo bar baz ", unicode.IsSpace))
/*
func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
func SplitAfter(s, sep string) []string { return genSplit(s, sep, len(sep), -1) }
func SplitN(s, sep string, n int) []string { return genSplit(s, sep, 0, n) }
func SplitAfterN(s, sep string, n int) []string { return genSplit(s, sep, len(sep), n) }
是由一个函数实现
它们都调用了 genSplit 函数。
这四个函数都是通过 sep 进行分割,返回[]string。如果 sep 为空,相当于分成一个个的 UTF-8 字符,如 Split("abc",""),得到的是[a b c]。
Split(s, sep) 和 SplitN(s, sep, -1) 等价;SplitAfter(s, sep) 和 SplitAfterN(s, sep, -1) 等价。
那么,Split 和 SplitAfter 有啥区别呢?通过这两句代码的结果就知道它们的区别了:
*/
fmt.Printf("%q\n", strings.Split("foo,bar,baz", ","))
fmt.Printf("%q\n", strings.SplitAfter("foo,bar,baz", ","))
/*
["foo" "bar" "baz"]
["foo," "bar," "baz"]
也就是说,Split 会将 s 中的 sep 去掉,而 SplitAfter 会保留 sep。
*/
fmt.Printf("%q\n", strings.SplitN("foo,bar,baz", ",", 2))
//["foo" "bar,baz"]
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 中是否以 prefix 开始
func HasPrefix(s, prefix string) bool {
return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
}
// s 中是否以 suffix 结尾
func HasSuffix(s, suffix string) bool {
return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
}
*/
//查找字符串 index
/*
// 在 s 中查找 sep 的第一次出现,返回第一次出现的索引
func Index(s, sep string) int
// chars中任何一个Unicode代码点在s中首次出现的位置
func IndexAny(s, chars string) int
// 查找字符 c 在 s 中第一次出现的位置,其中 c 满足 f(c) 返回 true
func IndexFunc(s string, f func(rune) bool) int
// Unicode 代码点 r 在 s 中第一次出现的位置
func IndexRune(s string, r rune) int
// 有三个对应的查找最后一次出现的位置
func LastIndex(s, sep string) int
func LastIndexAny(s, chars string) int
func LastIndexFunc(s string, f func(rune) bool) int
*/
fmt.Printf("%d\n", strings.IndexFunc("studygolang", func(c rune) bool {
if c > 'u' {
return true
}
return false
}))
// JOIN 相关操作
// func Join(a []string, sep string) string
fmt.Println(Join([]string{"name=xxx", "age=xx"}, "&"))
//字符串重复几次
fmt.Println("ba" + strings.Repeat("na", 2))
// 用 new 替换 s 中的 old,一共替换 n 个。
// 如果 n < 0,则不限制替换次数,即全部替换
//func Replace(s, old, new string, n int) string
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
}