Edited at

[Ruby] 配列を特定の条件で区切る


list = %w[1 茉里 2 乃莉 なずな 3 ゆの 宮子]

#=> ["1", "茉里", "2", "乃莉", "なずな", "3", "ゆの", "宮子"]

という配列がある。これを

[['1', '茉里'], ['2', '乃莉', 'なずな'], ['3', 'ゆの', '宮子']]

という様に区切りたい。

配列を区切るといえば思い浮かぶのは Enumerable#each_slice だが、このメソッドは固定の長さに区切るので、今回のように区切った後の配列の長さがまちまちなケースでは使えない。


方法

Enumerable#slice_when を使う。

# 次の要素が整数の文字列の場合は、その手前で区切る。

list.slice_when { |_a, b| b.match?(/\d+/) }.to_a
#=> [["1", "茉里"], ["2", "乃莉", "なずな"], ["3", "ゆの", "宮子"]]

なお、亜種として Enumerable#chunk_while というメソッドも存在する。slice_when は区切る条件を指定し、chunk_while は同じグループにする条件を指定するイメージだ。