2014-09-05 4 views
7

Кто-нибудь знает, как разделить строку в Голанге по длине?Разделить строку по длине в Голанге

Например, для разделения «helloworld» после каждых трех символов, поэтому он должен идеально возвращать массив «hel» «low» «orl» «d»?

Альтернативно возможным решением было бы также добавить новую строку после каждых 3-х символов ..

Все идеи очень ценятся!

+3

Ну, может быть, некоторые программы могут помочь? Как 's [n: n + 3] +" \ n "'? – Volker

ответ

17

Убедитесь, что 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世' 
2

Также необходимы функции, чтобы сделать это в последнее время, см 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 
} 
1

Вот еще один пример (вы можете попробовать 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")) 
} 
-1

Простое решение с помощью регулярных выражений

Re: = regexp.MustCompile ((\S{3})) х: = re.FindAllStringSubmatch ("HelloWorld", -1) fmt.Println (х)

https://play.golang.org/p/mfmaQlSRkHe

+0

я не понимаю –

+0

Диди и запустил его на игровой площадке Go Go?Не могли бы вы рассказать мне, что ты не понимаешь? – rahul

Смежные вопросы