登录
首页 >  Golang >  Go问答

在字符串搜索中处理 Unicode

来源:stackoverflow

时间:2024-04-26 20:57:33 136浏览 收藏

今天golang学习网给大家带来了《在字符串搜索中处理 Unicode》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

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

s := "foo 日本 foo!"

我正在尝试查找字符串中最后一次出现的 foo

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

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

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


正确答案


您遇到了 go 和字节中的符文之间的差异。字符串由字节组成,而不是符文。如果您还没有了解这一点,您应该阅读 https://blog.golang.org/strings

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

我不知道可以直接执行此操作的标准库方法。

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 
}

这非常接近:

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

到这里,我们也就讲完了《在字符串搜索中处理 Unicode》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>