参考:https://blog.csdn.net/chenxun_2010/article/details/74356719
https://blog.csdn.net/sphinx1122/article/details/86360427
一、获取golang特定下标中间的字符
字符串在内存中:双字结构,即一个指向实际数据的指针和记录字符串长度的整数。
字符串string s = "hello" 和字符串 t = s[2:3] 在内存中的结构如下图表示:
因为指针对用户完全不可见,所以我们依旧可以将字符串看成一个值类型,即一个字符数组。
将一个字符串s转为字节切片: c := []bytes(s)
截取一个字符串str的某部分: substr := str[start:end] (获取从索引 start 开始到 end-1 位置的子字符串)
str[start:] (获取从索引 start 开始到 len(str)-1 位置的子字符串)
str[:end] (获取从索引 0 开始到 end-1 位置的子字符串)
获取字符串str 的 start 字符的索引:strings.Index(str,start)
一个字符串str 可以直接: str = []s
二、修改字符串中的某个字符
Go 语言中的字符串是不可变的,也就是说 str[index] 这样的表达式是不可以被放在等号左侧的。如果尝试运行 str[i] = 'D' 会得到错误:cannot assign to str[i]。
因此,您必须先将字符串转换成字节数组,然后再通过修改数组中的元素值来达到修改字符串的目的,最后将字节数组转换回字符串格式。
例如,将字符串 "hello" 转换为 "cello":
s := "hello"
c := []byte(s)
c[0] = ’c’
s2 := string(c) // s2 == "cello"
所以,您可以通过操作切片来完成对字符串的操作。
三、正则
//查找连续的小写字母
reg := regexp.MustCompile(`[a-z]{2,}`)
fmt.Printf("%s\n", reg.FindAllString(text, -1))// [bc ca olang]
查找连续的非小写字母
reg = regexp.MustCompile(`[^a-z]{2,}`)
fmt.Printf("%s\n",reg.FindAllString(text, -1))//[ MFC 8 . 你好! G]
查找 abc 或 Golang
reg = regexp.MustCompile(`(abc|Golang)`)
fmt.Printf("%s\n", reg.FindAllString(text, -1)) //[Golang]
查找以 G开头,以 / 结尾的单词
reg = regexp.MustCompile(`G[\w.]*\/`)
fmt.Printf("%s\n", reg.FindAllString(text, -1)) //[Golang/]
查找从行首开始,以空格结尾的字符串
reg = regexp.MustCompile(`[\w]+\s`)
fmt.Printf("%s\n", reg.FindAllString(text, -1)) //[Abc a7c MFC ]
查找连续 1 次到 4 次的非空格字符,并以 c 结尾的字符串
reg = regexp.MustCompile(`[^\s]{1,4}c`)
fmt.Printf("%s\n", reg.FindAllString(text, -1)) //[Abc a7c 8c]
替换
查找 Abc 或 a7c 或 你好 ,替换为**号
reg = regexp.MustCompile(`(Abc|a7c|你好)`)
fmt.Printf("%s\n", reg.ReplaceAllString(text, "**")) //** ** MFC 8ca. **! Golang/