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])
}


如有错误,欢迎指正。

本文来自:CSDN博客

感谢作者:wowzai

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。