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*/)
просто создаст массив из первой группы захвата, что означает, что мы получим только одну цифру из последовательности, возможно, повторяющихся чисел.)