
离线 TA的专栏
- 打卡等级:热心大叔
- 打卡总天数:228
- 打卡月天数:0
- 打卡总奖励:3500
- 最近打卡:2025-04-20 20:26:40
|
重要性
字符串处理基本功,无论面试算法还是工作都经常使用到。以下我们以一个算法+一个实际工作场景的形式来阐述字符串处理。
以下算法都来自leecode中国
反转字符串
先来做下原题 题反转字符串
原题目要求不允许额外空间原地反转。 - 输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"]
复制代码直接一个循环反转了。 - func reverseString(s []byte) {
- //双指针,一个放头一个放尾
- i:=0
- j:=len(s)-1
- //反转这两个位置的元素
- for i<j {
- s[i],s[j]=s[j],s[i]
- i++
- j--
- }
-
- }
复制代码如果是 直接一个 就出来了, 得自己写确实麻烦。
拆分与合并字符串
题目直接传入就是字节数组,外部怎么处理呢?就是字符串和 的来回转换。 - s := []byte(str)
- reverseString(s)
- fmt.Println(string(s))
复制代码这样会把字符串变成一个个字节,想象一个场景你的文章有多个标签,全部塞到一个字段里。要拆分显示怎么操作? - # 拆分
- strList := strings.Split("Go语言,channel,并发", ",")
- fmt.Println(strList)
- # 合并
- str := strings.Join(strList,",")
- fmt.Println(str)
复制代码
- 是一个包,封装了很多字符串处理的函数。
- 拆分,参数一是字符串,参数二是分割符
- 合并,参数一是字符串数组,参数二是合并用的分割符
忽略大小写判等
一个验证码的场景,例如验证码是 用户输入 实际上也是对的。
全部转大写,或者全部转小写判等就行。我写粗糙一点,看不懂留言啊。 - strings.ToLower("2s5G") == "2s5g"
- strings.ToUpper("2s5G") == "2S5G"
复制代码当然 直接就提供了不区分大小写判断是否相等的办法。 - fmt.Println(strings.EqualFold("abc", "ABC"))
复制代码 蛇行命名转驼峰命名方式
涉及知识点:拆分、大小写转换、组合 - func main() {
- name := "ab_cde_as"
- strList := strings.Split(name,"_")
- for index,str := range strList{
- strList[index] = strings.ToUpper(string(str[0])) + str[1:]
- }
- name = strings.Join(strList,"")
- fmt.Println(name)
- }
复制代码
- 输出。
- 取其中一个字符,切片取字符串,得到位置闭区间的字符串。
当前可以直接用 来得到 。
替换和查找
替换和查找也是比较高频的操作。常见于配置替换,不过基本都用 命令搞定了。 - strings.Replace("ip:10.1.1.1", "10.1.1.1", "0.0.0.0", -1)
复制代码最后一个是次数, 代表全部替换,如果只替换一次就是 。
当前正常情况下不会那么蠢啦,都是用正则匹配的,比如我之前有个需求 把所有的图片网址取出来,存到我的对象存储里面,再插入回去,我就写了一个程序。
我写个简单版的。测试一下正则是否匹配,输出 。 - regexStr := "https*://[^\\s]*(jpg|png)"
- if ok, _ := regexp.MatchString(regexStr, "https://coding3min.com/abc.jpg"); ok {
- fmt.Println("ok")
- }
复制代码开始搞 - data := `
- 
- [](https://coding3min.com/abc.html)
- 
- https://coding3min.com
- `
- re, _ := regexp.Compile(regexStr)
- picList := re.FindAllString(data,-1)
- sort.Strings(picList)
- for k,v:=range picList{
- if k!=0 && picList[k]==picList[k-1]{
- continue
- }
- //省略改变图片链接
- afterStr := "xxx"
- re,_ = regexp.Compile(v)
- data = re.ReplaceAllString(data,afterStr)
- }
- fmt.Println(data)
复制代码
- 加载正则表达式。
- re.FindAllString(data,-1)
复制代码 查找所有匹配的结果,参数二代表查找几个,就是全部。返回一个。
- re.ReplaceAllString(data,afterStr)
复制代码 替换全部原字符串中所有匹配的,为新字符串(参数二),返回替换完后的结果。
- 至于倒数第四行为什么要再加载,是因为需要把当前图片当正则去匹配所有此图片内容。
- 至于为什么要排序,是为了去重,跳过重复匹配的部分。
其他速查
判断大小 前大 一样 后大 - strings.Compare("a", "b")
复制代码子串包含 - fmt.Println(strings.Contains("hello", "he"))
复制代码返回子串出现的次数 - fmt.Println(strings.Count("happy", "p"))
复制代码判断字符串是否以某子串开头、结尾 - fmt.Println(strings.HasPrefix("hello", "he"))
- fmt.Println(strings.HasSuffix("hello", "lo"))
复制代码返回字符串第一次出现的位置 不存在返回-1 - fmt.Println(strings.Index("abandon already", "a"))
复制代码返回字符串最后一次出现的位置 不存在返回-1 - fmt.Println(strings.LastIndex("abandon already", "a"))
复制代码 其他
处理中文汉字使用 包,就不展开说啦。
以上就是Go字符串操作深入解析的详细内容,更多关于Go字符串操作的资料请关注晓枫资讯其它相关文章!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|