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

前端之家收集整理的这篇文章主要介绍了Golang中获取中文字符串的子串字符位置及截取子串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

昨天准备用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相关文章