Golang中擷取中文字串的子串字元位置及截取子串

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

昨天準備用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])}


如有錯誤,歡迎指正。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.