首页 > 解决方案 > 在字符串搜索中处理 Unicode

问题描述

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

s := "foo 日本 foo!"

我试图foo在字符串中找到最后一次出现:

index := strings.LastIndex(s, "foo")

这里的预期结果是 7,但由于字符串中的 Unicode,这将返回 11 作为索引。

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

标签: go

解决方案


您遇到了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>
}

推荐阅读