八、Go语言包之strings--go语言学习笔记

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))

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值