Я нашел способ сделать это без регулярного выражения, используя Array#slice_when
:
"AAAABBBCDDD".chars.slice_when(&:!=).map(&:join)
#=> ["AAAA", "BBB", "C", "DDD"]
Хотя gsub
с регулярным выражением (как предложил Кэри Свовеланд в своем ответе) явно быстрее:
Benchmark.measure do
100_000.times { "AAAABBBCDDD".chars.slice_when(&:!=).map(&:join) }
end
# => #<Benchmark::Tms:0x00007fb11ff9a560
# @cstime=0.0,
# @cutime=0.0,
# @label="",
# @real=1.427345999982208,
# @stime=0.013876,
# @total=1.3629069999999996,
# @utime=1.3490309999999996>
Benchmark.measure do
100_000.times { "AAAABBBCDDD".gsub(/(.)(\1)*/).to_a }
end
=> #<Benchmark::Tms:0x00007fb1214f4dc0
# @cstime=0.0,
# @cutime=0.0,
# @label="",
# @real=0.6837240000022575,
# @stime=0.03575100000000003,
# @total=0.64306,
# @utime=0.6073089999999999>