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

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

昨天准备用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])
}


如有错误,欢迎指正。


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

本文来自:CSDN博客

感谢作者:wowzai

查看原文:Golang中获取中文字符串的子串字符位置及截取子串

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

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