Go 字符串搜索中的Unicode处理

Go 字符串搜索中的Unicode处理,go,Go,假设我有一个包含Unicode字符的字符串。例如: s:=“foo日本 福!” 我试图在字符串中找到最后一个出现的foo: index:=strings.LastIndex(s,“foo”) 此处的预期结果为7,但由于字符串中的Unicode,因此将返回11作为索引 有没有办法使用标准库函数来处理这个问题?您遇到了go和bytes中的符文之间的差异。字符串由字节组成,而不是符文。如果你还没有学会这一点,你应该阅读 这是我的快速函数版本,用于计算字符串中最后一个匹配子字符串之前的符文数。基本方

假设我有一个包含Unicode字符的字符串。例如:

s:=“foo日本 福!”
我试图在字符串中找到最后一个出现的
foo

index:=strings.LastIndex(s,“foo”)
此处的预期结果为7,但由于字符串中的Unicode,因此将返回11作为索引


有没有办法使用标准库函数来处理这个问题?

您遇到了go和bytes中的符文之间的差异。字符串由字节组成,而不是符文。如果你还没有学会这一点,你应该阅读

这是我的快速函数版本,用于计算字符串中最后一个匹配子字符串之前的符文数。基本方法是找到字节索引,然后迭代/计数字符串符文,直到消耗了该数量的字节

我不知道有哪种标准的库方法可以直接做到这一点

主程序包
进口(
“fmt”
“字符串”
)
func LastRuneIndex(s,substr字符串)(int,error){
byteIndex:=字符串。最后一个索引(s,substr)
如果byteIndex<0{
返回byteIndex,无
}
读卡器:=字符串。新建读卡器
计数:=0
对于byteIndex>0{
_,字节,错误:=reader.ReadRune()
如果错误!=零{
返回0,错误
}
字节索引=字节索引-字节
计数+=1
}
返回计数,零
}
func main(){
s:=“foo日本 福!”
计数,错误:=LastRuneIndex(s,“foo”)
格式打印项次(计数、错误)
//产出:
// 7 
}

这一点非常接近:

package main

import (
   "golang.org/x/text/language"
   "golang.org/x/text/search"
)

func main() {
   m := search.New(language.English)
   start, end := m.IndexString("foo 日本 foo!", "foo")
   println(start == 0, end == 3)
}
但它的搜索是向前的。我试过这个:

m.IndexString("foo 日本 foo!", "foo", search.Backwards)
但我得到的结果是:

panic: TODO: implement

你所说的“处理这件事”是什么意思?您希望索引指向字符而不是字节吗?一个非常简单的方法是:一个更有效的函数可能是避免最初的
LastIndex
调用,并直接比较读取器中的下一个字符。。。这有点像O(2n)和O(n)的复杂性差异,所以我不想尝试。