string - 在 Golang 中按长度拆分字符串

标签 string split go string-length

有人知道如何在 Golang 中按长度分割字符串吗?

例如在每 3 个字符后拆分“helloworld”,所以理想情况下它应该返回一个由“hel”“low”“orl”“d”组成的数组?

另一种可能的解决方案是在每 3 个字符后添加一个换行符。

非常感谢所有想法!

最佳答案

确保 convert 你的string成一片 rune :见“Slice string into letters”。

for 自动将 string 转换为 rune 因此在这种情况下不需要额外的代码来转换 stringrune 首先。

for i, r := range s {
    fmt.Printf("i%d r %c\n", i, r)
    // every 3 i, do something
}

r[n:n+3] 最适合作为 rune slice 。

索引将在每个 rune 中增加 一个,而在 slice of string 中它可能每个字节增加一个以上 : "世界": i 将是 0 和 3:一个字符( rune )可以由多个字节组成。


例如,考虑 s := "世a界世bcd界efg世":12 个 rune 。 (见 play.golang.org )

如果您尝试逐字节解析它,您将错过(在每 3 个字符的天真分割实现中)一些“索引模 3”(等于 2、5、8 和 11),因为索引将超过这些值:

for i, r := range s {
    res = res + string(r)
    fmt.Printf("i %d r %c\n", i, r)
    if i > 0 && (i+1)%3 == 0 {
        fmt.Printf("=>(%d) '%v'\n", i, res)
        res = ""
    }
}

输出:

i  0 r 世
i  3 r a   <== miss i==2
i  4 r 界
i  7 r 世  <== miss i==5
i 10 r b  <== miss i==8
i 11 r c  ===============> would print '世a界世bc', not exactly '3 chars'!
i 12 r d
i 13 r 界
i 16 r e  <== miss i==14
i 17 r f  ===============> would print 'd界ef'
i 18 r g
i 19 r 世 <== miss the rest of the string

但是,如果您要对 rune 进行迭代(a := []rune(s)),您会得到您所期望的,因为索引会一次增加一个 rune ,使其很容易准确地聚合 3 个字符:

for i, r := range a {
    res = res + string(r)
    fmt.Printf("i%d r %c\n", i, r)
    if i > 0 && (i+1)%3 == 0 {
        fmt.Printf("=>(%d) '%v'\n", i, res)
        res = ""
    }
}

输出:

i 0 r 世
i 1 r a
i 2 r 界 ===============> would print '世a界'
i 3 r 世
i 4 r b
i 5 r c ===============> would print '世bc'
i 6 r d
i 7 r 界
i 8 r e ===============> would print 'd界e'
i 9 r f
i10 r g
i11 r 世 ===============> would print 'fg世'

关于string - 在 Golang 中按长度拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25686109/

相关文章:

c - 无法访问字符指针数组

java - 如何在 java/android 中重复执行任务?

go - 跟踪 Go 中的 ast.Walk() 解析错误

Java 字符串到 Python 字符串编码 "error"

python - 从 Python 中的 unicode 字符串中删除 HTML 标签

shell - Zsh - 使用点运算符时按空格拆分字符串

python - 使用多字符定界符拆分字符串

java - 如何将字符串分成每三个单词(JAVA)

map - 带有类型映射的数组

go - 如何在 Kubernetes 中添加新包