2013-03-14 1 views
10

Bir dizeyi belirli bir boyuta göre parçalar halinde bölmem gerekiyor. Parçalar arasında sözcükleri kıramıyorum, bu yüzden sonraki kelimeyi eklerken yığın boyutunun üzerine gidip bir sonrakine başlamam gerekir (bir yığının belirtilen boyuttan küçük olması sorun değil).Bir dize, sözcükleri parçalamadan belirtilen boyuttaki parçalara bölme

İşte çalışma kodum, ancak bunu yapmak için daha zarif bir yol bulmak istiyorum.

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 

cevap

20

ne dersiniz: @sawa comment sonra

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

Güncelleme:

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

Bu

W \ ile sona erdirmek için bir dize gerektirmez olarak iyidir Ve belirtilen uzunluktan daha uzun kelimeleri işleyecektir. Aslında onları böler, ancak bu istenen davranışın

+0

harika çalışıyor, çok teşekkürler! bir şey daha: buradaki boşlukları düzeltebilir miyiz? – psychickita

+0

elbette: 'str.scan (/. {1,25} \ W /) harita (&: şerit)' –

+1

Bu, iyi yakın, ama her zaman sonunda bir '\ W' karakteri gerektirir. Özel örneğinizde, sonunda '' ve '. 'Nedeniyle çalıştı, ama onsuz, işe yaramaz. Her bir parça, zorunlu olmadığı zaman mutlaka bir '\ W 'karakteri ile biter. – sawa

5

@Yuriy olduğunu farzedersiniz. Ne hakkında:

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

Evet, bu daha iyi görünüyor, ancak 25 sembolden daha uzun kelimeleri kesecek. –