最後の数字だけ違う文字列をグループ分けしたかったんですが、自分で書いてみるとこんな面倒くさい感じになって (´・ω・`)ショボーン

a1 = %w(foo1 foo2 foo3 bar1 bar3 buz2)
a2 = a1.map{|v| v.sub(/[0-9]$/,"")}.uniq

tmp = Array.new(a2.size)
a2.each_with_index do |v2, i|
  a1.each do |v1|
    if v1.sub(/[0-9]$/, "") == v2
      tmp[i].nil? ? tmp[i] = [v1] : tmp[i].push(v1)
    end
  end
end

p tmp # => [["foo1", "foo2", "foo3"], ["bar1", "bar3"], ["buz2"]]

なので、調べてみたら非常に簡単な方法が見つかりました。

a1 = %w(foo1 foo2 foo3 bar1 bar3 buz2)
p a1.group_by{|x| x[/[a-zA-Z]+/] }.values

Rubyすげぇ!

参考

[arrays – Group strings with similar pattern in Ruby – Stack Overflow][1]