在Ruby中将string切分成给定长度的最佳方法是什么?
我一直在寻找一种优雅而有效的方式来将string分块成Ruby中给定长度的子string。
到目前为止,我能想到的最好的是:
def chunk(string, size) (0..(string.length-1)/size).map{|i|string[i*size,size]} end >> chunk("abcdef",3) => ["abc", "def"] >> chunk("abcde",3) => ["abc", "de"] >> chunk("abc",3) => ["abc"] >> chunk("ab",3) => ["ab"] >> chunk("",3) => []
您可能希望chunk("", n)
返回[""]
而不是[]
。 如果是这样,只需添加这个方法的第一行:
return [""] if string.empty?
你会推荐更好的解决scheme吗?
编辑
感谢Jeremy Ruten提供的优雅高效解决scheme:
def chunk(string, size) string.scan(/.{1,#{size}}/) end
使用String#scan
:
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{4}/) => ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx"] >> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,4}/) => ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz"] >> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,3}/) => ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]
这是另一种方式来做到这一点:
"abcdefghijklmnopqrstuvwxyz".chars.to_a.each_slice(3).to_a.map {|s| s.to_s }
=> [“abc”,“def”,“ghi”,“jkl”,“mno”,“pqr”,“stu”,“vwx”,“yz”]
如果您知道您的string是块大小的倍数,我认为这是最有效的解决scheme
def chunk(string, size) (string.length / size).times.collect { |i| string[i * size, size] } end
和零件
def parts(string, count) size = string.length / count count.times.collect { |i| string[i * size, size] } end
test.split(/(...)/).reject {|v| v.empty?}
拒绝是必要的,因为它包含了组之间的空白区域。 我的正则expression式不是很高兴看到如何解决这个问题。
你有什么其他的限制吗? 否则,我会非常想做一些简单的事情
[0..10].each { str[(i*w),w] }