为了账号安全,请及时绑定邮箱和手机立即绑定

反转字符串范围

反转字符串范围

Go
ibeautiful 2022-10-17 15:40:24
如何在 Go 中“反向范围”遍历 a 的单个字符string?例如,给定s := "some string \u1222 whatever"- 我想做类似的事情:for i, v := ~reverse~ range s { }请注意,我对通过标准库的解决方案感兴趣,而不必自己编写函数。我知道大量现有的图书馆可以做到这一点,但这无关紧要。此外 - 我不能使用len(s)和做:for i := len(s) - 1; i >= 0; i-- { }因为 Go 内置len函数仅返回字符串中的字节数(不适用于非 ASCII 字符串)。由于上述原因,我也无法执行指令提供的索引len(s) - k - 1在哪里。krangeUPD1:可以对 s 进行反向(从右到左)查找,因为我们可以通过每个字节或字节组的高位utf-8 rune轻松识别s。rune从The Go Programming Language书: 如您所见,我们可以从最后一个字节开始,我们需要向左扫描最多 4 个字节才能得到一个.rune
查看完整描述

2 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

最简单的解决方案是将 to 转换string为[]rune,因此您可以对其进行迭代,但索引“向后”(或使用向下循环):


rs := []rune(s)

max := len(rs) - 1

for i := range rs {

    r := rs[max-i]

    fmt.Printf("%c ", r)

}

这将输出(在Go Playground上尝试):


r e v e t a h w   ሢ   g n i r t s   e m o s 

如果你想避免[]rune转换,你可以utf8.DecodeLastRuneInString()这样使用:


for {

    r, size := utf8.DecodeLastRuneInString(s)

    if r == utf8.RuneError {

        break

    }

    fmt.Printf("%c ", r)

    s = s[:len(s)-size]

}

这输出相同,在Go Playground上试试这个。



查看完整回答
反对 回复 2022-10-17
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

你可以做:


runes:=[]rune(str)

for x:=len(runes)-1; x>=0; x-- {

   // work with runes[x]

}


查看完整回答
反对 回复 2022-10-17
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信