go - 在字符串搜索中处理 Unicode
问题描述
假设我有一个包含 Unicode 字符的字符串。例如:
s := "foo 日本 foo!"
我试图foo
在字符串中找到最后一次出现:
index := strings.LastIndex(s, "foo")
这里的预期结果是 7,但由于字符串中的 Unicode,这将返回 11 作为索引。
有没有办法使用标准库函数来处理这个问题?
解决方案
您遇到了go 和 bytes 中的符文之间的区别。字符串由字节组成,而不是符文。如果你还没有了解这一点,你应该阅读https://blog.golang.org/strings。
这是我的快速函数版本,用于计算字符串中子字符串的最后一次匹配之前的符文数。基本方法是找到字节索引,然后遍历/计数字符串 rune,直到消耗掉该字节数。
我不知道可以直接执行此操作的标准库方法。
package main
import (
"fmt"
"strings"
)
func LastRuneIndex(s, substr string) (int, error) {
byteIndex := strings.LastIndex(s, substr)
if byteIndex < 0 {
return byteIndex, nil
}
reader := strings.NewReader(s)
count := 0
for byteIndex > 0 {
_, bytes, err := reader.ReadRune()
if err != nil {
return 0, err
}
byteIndex = byteIndex - bytes
count += 1
}
return count, nil
}
func main() {
s := "foo 日本 foo!"
count, err := LastRuneIndex(s, "foo")
fmt.Println(count, err)
// outputs:
// 7 <nil>
}
推荐阅读
- prisma - Prisma.io 如何过滤 ENUM 字段具有 ANY 值的位置
- python - 使用 Scrapy 选择包含特定属性的所有 Div 的 XPATH
- php - 使用 Incoming webhooks 或 chat.postMessage 向 Slack 频道构建发送消息?
- c# - C# AutoMapper 将展平对象映射到复杂对象列表
- c# - 从 API 获取大量数据会返回错误
- azure-cognitive-search - 在 Azure 搜索中返回页码?
- python - 当我设置标记大小或不透明度时,3D 散点不会显示在 Plotly 上
- javascript - 'passport.authenticate("google")' - React 客户端不重定向
- python - 为什么我在阅读时不能使用路径
- python - Jython 2.7.1 的相关 Python 版本是什么?