string - 反转字符串范围

标签 string loops go

如何在 Go 中对 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,其中 k 是由 range 指令提供的索引。


UPD1: 可以对 utf-8 rune 进行反向(从右到左)查找,因为我们可以很容易地识别 rune每个字节或字节组的顺序位。摘自 The Go Programming Language 一书:
enter image description here
如您所见,我们可以从最后一个字节开始,我们最多需要向左扫描 4 个字节才能获得 rune

最佳答案

最简单的解决方案是将 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 上试试这个.

关于string - 反转字符串范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70130406/

相关文章:

javascript - 使用循环创建动态嵌套对象

matlab - 当一维未知时在循环之前定义一个矩阵

go - {{template "name"pipeline}} 是什么意思

go - 使用结构解析 YAML

java - 如何根据条件获取字符串的特定部分?

Java/XML : use a string in another string

java - 如何计算String Buffer的容量?

Excel VBA 循环行直到空单元格

java - Go服务器与Java客户端通信

string - Cow<str> 切片的通用操作