2013-03-14 4 views
10

Ich muss eine Zeichenfolge in Stücke je nach einer bestimmten Größe aufteilen. Ich kann keine Wörter zwischen Chunks aufteilen, daher muss ich beim Hinzufügen des nächsten Wortes feststellen, dass es die Chunk-Größe überschreitet und die nächste beginnt (es ist in Ordnung, wenn ein Chunk kleiner als die angegebene Größe ist).Teilen Sie eine Zeichenfolge in Stücke der angegebenen Größe ohne Wörter zu brechen

Hier ist mein Arbeitscode, aber ich würde gerne einen eleganteren Weg finden, dies zu tun.

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 

Antwort

20

Wie wäre:

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)."] 

Update nach @sawa Kommentar:

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

Das ist besser, als es nicht um eine Zeichenfolge zu Ende mit \ W

erfordert

Und es wird mit Wörtern umgehen, die länger als die angegebene Länge sind. Eigentlich wird es sie teilen, aber ich nehme an, das ist das gewünschte Verhalten

+0

funktioniert super, vielen Dank! noch eine Sache: können wir nachfolgende Leerzeichen genau hier einpassen? – psychickita

+0

natürlich: 'str.scan (/. {1,25} \ W /). Map (&: strip)' –

+1

Das ist nah an gut, aber es erfordert immer ein '\ W'-Zeichen am Ende. In Ihrem speziellen Beispiel funktionierte es am Ende wegen der ')' und '.', aber ohne es wird es nicht funktionieren. Jedes Chunk endet auch notwendigerweise mit einem '\ W'-Zeichen, wenn es nicht muss. – sawa

5

@Yuriy, sieht Ihre Abwechslung wie Ärger. Wie wäre es mit:

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

Ja, das scheint besser, aber es wird Wörter länger als 25 Symbole abgeschnitten. –

Verwandte Themen