Ответ 1
split
будет использовать только то, что он соответствует разделителю, удалив его из соответствующей строки. То, что вы ищете, scan
:
str = "6885558 8866887777"
str.scan(/((\d)\2*)/).map(&:first)
# => ["6", "88", "555", "8", "88", "66", "88", "7777"]
Принимая это медленно, \d
соответствует любой цифре. Он во второй группе захвата, поэтому \2*
затем соответствует любым последующим появлениям той же цифры. Это создает массив, который выглядит как
[["6", "6"], ["88", "8"], ["555", "5"], ["8", "8"],
["88", "8"], ["66", "6"], ["88", "8"], ["7777", "7"]]
Поскольку нам нужен только первый элемент в каждом из этих вспомогательных массивов, мы можем собрать их все с помощью map(&:first)
.
(Обратите внимание, что str.scan(/(\d)\1*/)
просто создаст массив из первой группы захвата, а это означает, что мы получим только одну цифру из последовательности, возможно, повторяющихся чисел.)