2013-03-14 9 views
10

Potrzebuję podzielić ciąg na kawałki według określonego rozmiaru. Nie mogę łamać słów między porcjami, więc muszę złapać, gdy kolejne słowo przejdzie przez wielkość porcji i zacznie następną (jest ok, jeśli porcja jest mniejsza niż określony rozmiar).Podziel ciąg na kawałki o określonej wielkości bez łamania słów

Oto mój działający kod, ale chciałbym znaleźć bardziej elegancki sposób, aby to zrobić.

def split_into_chunks_by_size(chunk_size, string) 
    string_split_into_chunks = [""] 
    string.split(" ").each do |word| 
    if (string_split_into_chunks[-1].length + 1 + word.length > chunk_size) 
     string_split_into_chunks << word 
    else 
     string_split_into_chunks[-1] << " " + word 
    end 
    end 
    return string_split_into_chunks 
end 

Odpowiedz

20

Jak o:

str = "split a string into chunks according to a specific size. Seems easy enough, but here is the catch: I cannot be breaking words between chunks, so I need to catch when adding the next word will go over chunk size and start the next one (its ok if a chunk is less than specified size)." 
str.scan(/.{1,25}\W/) 
=> ["split a string into ", "chunks according to a ", "specific size. Seems easy ", "enough, but here is the ", "catch: I cannot be ", "breaking words between ", "chunks, so I need to ", "catch when adding the ", "next word will go over ", "chunk size and start the ", "next one (its ok if a ", "chunk is less than ", "specified size)."] 

aktualizacja po @sawa Komentarz:

str.scan(/.{1,25}\b|.{1,25}/).map(&:strip) 

To jest lepsze, gdyż nie wymaga ciąg kończyć \ W

I będzie obsługiwać słowa dłuższe niż określona długość. Właściwie to je podzieli, ale zakładam, że to pożądane zachowanie.

+0

działa świetnie, wielkie dzięki! jeszcze jedno: czy możemy przyciąć końcowe miejsca tutaj? – psychickita

+0

oczywiście: 'str.scan (/. {1,25} \ W /). Map (&: strip)' –

+1

To jest prawie dobre, ale zawsze wymaga znaku '\ W' na końcu. W twoim konkretnym przykładzie zadziałało to z powodu ')' i '.' na końcu, ale bez niego, to nie zadziała. Każdy fragment również koniecznie kończy się znakiem '\ W', gdy nie musi. – sawa

5

@ Yuriy, twoja alternacja wygląda na kłopot. Co powiesz na:

str.scan /\S.{1,24}(?!\S)/ 
#=> ["split a string into", "chunks according to a", "specific size. Seems easy", "enough, but here is the", "catch: I cannot be", "breaking words between", "chunks, so I need to", "catch when adding the", "next word will go over", "chunk size and Start the", "next one (its ok if a", "chunk is less than", "specified size)."] 
+0

Tak, to wydaje się lepsze, ale spowoduje skrócenie słów dłuższych niż 25 symboli. –