這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
昨天準備用golang做一個簡單的文本分析,需要簡單的對字串進行一些操作,在查看了strings和strconv庫時,我沒找到截取字串的函數,同時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])}
如有錯誤,歡迎指正。