有誰知道如何在Golang中分割字符串的長度?在Golang中按長度分割字符串
例如要在每3個字符後分隔「helloworld」,所以它應該理想地返回一個「hel」「low」「orl」「d」的數組?
另外一個可能的解決方案是每3個字符後還附加一個換行符..
所有的想法都非常感謝!
有誰知道如何在Golang中分割字符串的長度?在Golang中按長度分割字符串
例如要在每3個字符後分隔「helloworld」,所以它應該理想地返回一個「hel」「low」「orl」「d」的數組?
另外一個可能的解決方案是每3個字符後還附加一個換行符..
所有的想法都非常感謝!
確保convert您string到符文的一個切片:詳見「Slice string into letters」
a := []rune(s)
for i, r := range a {
fmt.Printf("i%d r %c\n", i, r)
// every 3 i, do something
}
a[n:n+3]
將工作最有作爲的符文的一個切片。
該指數將由一個每一個符文增加,而這可能會在slice of string增加一個以上的每個字節:「世界」:i
將是0和3:一個字符(符文)可由多個字節組成。
例如,考慮s := "世a界世bcd界efg世"
:12符文。 (見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
但是,如果你要迭代的符文(a := []rune(s)
),你會得到你所期望的,因爲索引將增加rease一個符文的時間,因此很容易聚集正好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世'
還需要一個功能近期做到這一點,看到example usage here
func SplitSubN(s string, n int) []string {
sub := ""
subs := []string{}
runes := bytes.Runes([]byte(s))
l := len(runes)
for i, r := range runes {
sub = sub + string(r)
if (i + 1) % n == 0 {
subs = append(subs, sub)
sub = ""
} else if (i + 1) == l {
subs = append(subs, sub)
}
}
return subs
}
這裏是另一個例子(你可以試試here):
package main
import (
"fmt"
"strings"
)
func ChunkString(s string, chunkSize int) []string {
var chunks []string
runes := []rune(s)
if len(runes) == 0 {
return []string{s}
}
for i := 0; i < len(runes); i += chunkSize {
nn := i + chunkSize
if nn > len(runes) {
nn = len(runes)
}
chunks = append(chunks, string(runes[i:nn]))
}
return chunks
}
func main() {
fmt.Println(ChunkString("helloworld", 3))
fmt.Println(strings.Join(ChunkString("helloworld", 3), "\n"))
}
使用正則表達式
再一個簡單的方法:= regexp.MustCompile((\S{3})
) X:= re.FindAllStringSubmatch( 「HelloWorld」 的,-1) fmt.Println(X)
我不明白 – 2018-02-10 06:51:42
Didi你在The Go Playground中運行嗎?你能告訴我你不明白嗎? – rahul 2018-02-11 00:30:06
那麼,一些編程可能有幫助嗎?像's [n:n + 3] +「\ n」'? – Volker 2014-09-05 12:39:35