设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间03 现在时间03 缓存数据 我的天 我居然可以遇见活的大佬

我的天 我居然可以遇见活的大佬 -- 空山新雨后

查看: 1870|回复: 5

Go字符串操作深入解析

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:228
  • 打卡月天数:0
  • 打卡总奖励:3500
  • 最近打卡:2025-04-20 20:26:40
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
462
主题
420
精华
0
金钱
4850
积分
946
注册时间
2023-1-22
最后登录
2025-5-31

发表于 2023-3-1 22:56:10 来自手机 | 显示全部楼层 |阅读模式
重要性

字符串处理基本功,无论面试算法还是工作都经常使用到。以下我们以一个算法+一个实际工作场景的形式来阐述字符串处理。
以下算法都来自leecode中国

反转字符串

先来做下原题
  1. 344
复制代码
题反转字符串
原题目要求不允许额外空间原地反转。
  1. 输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"]
复制代码
直接一个循环反转了。
  1. func reverseString(s []byte)  {
  2.     //双指针,一个放头一个放尾
  3.     i:=0
  4.     j:=len(s)-1
  5.     //反转这两个位置的元素
  6.     for i<j {
  7.         s[i],s[j]=s[j],s[i]
  8.         i++
  9.         j--
  10.     }
  11.    
  12. }
复制代码
如果是
  1. python
复制代码
直接一个
  1. revert
复制代码
就出来了,
  1. Go
复制代码
得自己写确实麻烦。

拆分与合并字符串

题目直接传入就是字节数组,外部怎么处理呢?就是字符串和
  1. byte
复制代码
的来回转换。
  1. s := []byte(str)
  2. reverseString(s)
  3. fmt.Println(string(s))
复制代码
这样会把字符串变成一个个字节,想象一个场景你的文章有多个标签,全部塞到一个字段里。要拆分显示怎么操作?
  1. # 拆分
  2. strList := strings.Split("Go语言,channel,并发", ",")
  3. fmt.Println(strList)
  4. # 合并
  5. str := strings.Join(strList,",")
  6. fmt.Println(str)
复制代码

    1. strings
    复制代码
    是一个包,封装了很多字符串处理的函数。
    1. strings.Split
    复制代码
    拆分,参数一是字符串,参数二是分割符
    1. strings.Join
    复制代码
    合并,参数一是字符串数组,参数二是合并用的分割符

忽略大小写判等

一个验证码的场景,例如验证码是
  1. 2s5G
复制代码
用户输入
  1. 2s5g
复制代码
实际上也是对的。
全部转大写,或者全部转小写判等就行。我写粗糙一点,看不懂留言啊。
  1. strings.ToLower("2s5G") == "2s5g"
  2. strings.ToUpper("2s5G") == "2S5G"
复制代码
当然
  1. strings
复制代码
直接就提供了不区分大小写判断是否相等的办法。
  1. fmt.Println(strings.EqualFold("abc", "ABC"))
复制代码
蛇行命名转驼峰命名方式

涉及知识点:拆分、大小写转换、组合
  1. func main() {
  2.         name := "ab_cde_as"
  3.         strList := strings.Split(name,"_")
  4.         for index,str := range strList{
  5.                 strList[index] = strings.ToUpper(string(str[0])) + str[1:]
  6.         }
  7.         name = strings.Join(strList,"")
  8.         fmt.Println(name)
  9. }
复制代码

  • 输出
    1. AbCdeAs
    复制代码

    1. str[0]
    复制代码
    取其中一个字符,
    1. str[1:]
    复制代码
    切片取字符串,得到
    1. [1,len(str)]
    复制代码
    位置闭区间的字符串。
当前可以直接用
  1. strings.Title("hello")
复制代码
来得到
  1. Hello
复制代码


替换和查找

替换和查找也是比较高频的操作。常见于配置替换,不过基本都用
  1. sed
复制代码
命令搞定了。
  1. strings.Replace("ip:10.1.1.1", "10.1.1.1", "0.0.0.0", -1)
复制代码
最后一个是次数,
  1. -1
复制代码
代表全部替换,如果只替换一次就是
  1. 1
复制代码

当前正常情况下不会那么蠢啦,都是用正则匹配的,比如我之前有个需求把所有的图片网址取出来,存到我的对象存储里面,再插入回去,我就写了一个程序。
我写个简单版的。测试一下正则是否匹配,输出
  1. ok
复制代码
  1. regexStr := "https*://[^\\s]*(jpg|png)"
  2.         if ok, _ := regexp.MatchString(regexStr, "https://coding3min.com/abc.jpg"); ok {
  3.                 fmt.Println("ok")
  4.         }
复制代码
开始搞
  1. data := `
  2. ![](http://coding3min.com/abc.jpg)
  3. [](https://coding3min.com/abc.html)
  4. ![](https://coding3min.com/abc.png)
  5. https://coding3min.com
  6. `
  7.         re, _ := regexp.Compile(regexStr)
  8.         picList := re.FindAllString(data,-1)
  9.         sort.Strings(picList)
  10.         for k,v:=range picList{
  11.                 if k!=0 && picList[k]==picList[k-1]{
  12.                         continue
  13.                 }
  14.                 //省略改变图片链接
  15.                 afterStr := "xxx"
  16.                 re,_ = regexp.Compile(v)
  17.                 data = re.ReplaceAllString(data,afterStr)
  18.         }
  19.         fmt.Println(data)
复制代码

    1. regexp.Compile(regexStr)
    复制代码
    加载正则表达式。
    1. re.FindAllString(data,-1)
    复制代码
    查找所有匹配的结果,参数二代表查找几个,
    1. -1
    复制代码
    就是全部。返回一个
    1. list
    复制代码

    1. re.ReplaceAllString(data,afterStr)
    复制代码
    替换全部原字符串中所有匹配的,为新字符串(参数二),返回替换完后的结果。
  • 至于倒数第四行为什么要再加载,是因为需要把当前图片当正则去匹配所有此图片内容。
  • 至于为什么要排序,是为了去重,跳过重复匹配的部分。

其他速查

判断大小
  1. 1
复制代码
前大
  1. 0
复制代码
一样
  1. -1
复制代码
后大
  1. strings.Compare("a", "b")
复制代码
子串包含
  1. fmt.Println(strings.Contains("hello", "he"))
复制代码
返回子串出现的次数
  1. fmt.Println(strings.Count("happy", "p"))
复制代码
判断字符串是否以某子串开头、结尾
  1. fmt.Println(strings.HasPrefix("hello", "he"))
  2. fmt.Println(strings.HasSuffix("hello", "lo"))
复制代码
返回字符串第一次出现的位置 不存在返回-1
  1. fmt.Println(strings.Index("abandon already", "a"))
复制代码
返回字符串最后一次出现的位置 不存在返回-1
  1. fmt.Println(strings.LastIndex("abandon already", "a"))
复制代码
其他

处理中文汉字使用
  1. utf8
复制代码
包,就不展开说啦。
以上就是Go字符串操作深入解析的详细内容,更多关于Go字符串操作的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:常驻代表
  • 打卡总天数:32
  • 打卡月天数:0
  • 打卡总奖励:394
  • 最近打卡:2025-04-20 08:14:13
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
7
精华
0
金钱
488
积分
75
注册时间
2023-1-16
最后登录
2025-4-20

发表于 2023-3-24 10:28:43 | 显示全部楼层
感谢分享~~~~感谢分享~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
23
积分
26
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2024-3-5 12:27:06 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2024-7-12 14:29:04 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2024-9-17 18:34:17 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
13
积分
6
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-3-20 22:35:22 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
6楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表