分享
  1. 首页
  2. 文章

Golang中获取中文字符串的子串字符位置及截取子串

wowzai · · 15890 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

昨天准备用golang做一个简单的文本分析,需要简单的对字符串进行一些操作,在查看了stringsstrconv库时,我没找到截取字符串的函数,同时strings.Index返回的是子串的字节位置,例如这个例子:strings.Index("早上好,张先生!","好") 的返回值是6,而不是2(从0开始算)。


于是我自己写了一个处理中文的返回字符串子串位置的函数,思想其实很简单,首先通过strings库中的Index函数获得子串的字节位置,再通过这个位置获得子串之前的字节数组pre,再将pre转换成[]rune,获得[]rune的长度,便是子串之前字符串的长度,也就是子串在字符串中的字符位置,具体代码如下:


func UnicodeIndex(str,substr string) int {
 // 子串在字符串的字节位置
 result := strings.Index(str,substr) 
 if result >= 0 {
 // 获得子串之前的字符串并转换成[]byte
 prefix := []byte(str)[0:result] 
	// 将子串之前的字符串转换成[]rune
 rs := []rune(string(prefix)) 
	// 获得子串之前的字符串的长度,便是子串在字符串的字符位置
 result = len(rs)
 }
 
 return result
}


注意,这里用的是string.Index函数,类似的,也可以写中文字符串的类似strings中的IndexAny,LastIndex等函数


同样的思想,我也写了一个截取中文字符串的函数,如下:


func SubString(str string,begin,length int) (substr string) {
 // 将字符串的转换成[]rune
 rs := []rune(str)
 lth := len(rs)
 
 // 简单的越界判断
 if begin < 0 {
 begin = 0
 }
 if begin >= lth {
 begin = lth
 }
 end := begin + length
 if end > lth {
 end = lth 
 }
 
 // 返回子串
 return string(rs[begin:end])
}


如有错误,欢迎指正。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
15890 次点击
1 回复 | 直到 2018年04月17日 14:20:14
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏