如何将字符串拆分成块?

时间:2014-01-13 00:02:46

标签: ruby

我有一串非常长的数字(1000个字符)。我想将其分解为5个chuck并插入数组arr

str = "7316717653133062491922511967442657474206326239578318016 ..."

我尝试了each_slice,但当我尝试require 'enumerator'#=> irb说:false

str.each_slice(5).to_a

我希望输出看起来像:

arr = [ "73167", "17653", "33062", ... ] 

如何实现这一目标?

4 个答案:

答案 0 :(得分:10)

问题在于您尝试对不可枚举的对象(字符串)执行可枚举的方法。您可以尝试在字符串上使用scan来查找5个组:

arr = str.scan /.{1,5}/

如果你想进入可枚举的路线,你可以先将字符串分解为一个字符数组,得到5个组,然后将它们连接成5个字符的字符串:

arr = str.chars.each_slice(5).map(&:join)

答案 1 :(得分:5)

不知道为什么你要求可枚举,它在ruby核心中并不需要被要求。

arr = []
until string.empty?
  arr << string.slice!(0..4)
end

答案 2 :(得分:1)

我会去使用正则表达式。我认为 - 没有进行任何测试 - 它是一种更快的解决方案:

以下是一些代码:

2.0.0-p247 :001 > string = '1231249081029381028401982301984870895710394871023857012378401928374102394871092384710398275018923501892347'
 => "1231249081029381028401982301984870895710394871023857012378401928374102394871092384710398275018923501892347" 
2.0.0-p247 :002 > string.scan(/\d{4}/)
 => ["1231", "2490", "8102", "9381", "0284", "0198", "2301", "9848", "7089", "5710", "3948", "7102", "3857", "0123", "7840", "1928", "3741", "0239", "4871", "0923", "8471", "0398", "2750", "1892", "3501", "8923"] 
2.0.0-p247 :003 > 

注意:我在我的例子中使用了4个字符而不是5个..但是你明白了。

答案 3 :(得分:0)

我会小心使用.chars,因为它必须使用字符串的字符分配一个单独的数组。一般来说,我建议使用块(如果可用)或索引,因为它运行速度更快,内存更有效。在过去,我使用过具有以下块的拆分器:

def splitter(input, chunk_size = 2, &block)
  (0..input.length/chunk_size - 1).each do |i|
    yield input.slice(i * chunk_size, chunk_size) if block_given?
  end
end

:008 > splitter("test\nwow") {|x| p x}
"te"
"st"
"\nw"
"ow"
 => 0..3