Go中子字符串的字符位置

时间:2014-02-16 09:49:35

标签: string go rune

我怎样才能知道字符串中子字符串的位置,用字符(或符文)代替字节?

strings.Index(s, sub)将以字节为单位给出位置。使用Unicode时,它与符文中的位置不匹配:http://play.golang.org/p/DnlFjPaD2j

func main() {
    s := "áéíóúÁÉÍÓÚ"
    fmt.Println(strings.Index(s, "ÍÓ"))
}

结果:1​​4。预期:7

当然,我可以将ssub转换为[]rune并手动查找子列表,但有更好的方法吗?

与此相关,要获取字符串的第一个n字符,我正在执行此操作:string([]rune(s)[:n])。这是最好的方式吗?

2 个答案:

答案 0 :(得分:5)

导入unicode/utf8包后,您可以这样做:

func main() {
    s := "áéíóúÁÉÍÓÚ"
    i := strings.Index(s, "ÍÓ")
    fmt.Println(utf8.RuneCountInString(s[:i]))
}

http://play.golang.org/p/Etszu3rbY3

答案 1 :(得分:0)

另一种选择:

package main
import "strings"

func runeIndex(s, substr string) int {
   n := strings.Index(s, substr)
   if n == -1 { return -1 }
   r := []rune(s[:n])
   return len(r)
}

func main() {
   n := runeIndex("áéíóúÁÉÍÓÚ", "ÍÓ")
   println(n == 7)
}