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