split
będzie po prostu użyć cokolwiek pasuje jako ogranicznik, usuwając go z ciągu znaków w pytaniu. Czego szukasz scan
:
str = "6885558 8866887777"
str.scan(/((\d)\2*)/).map(&:first)
# => ["6", "88", "555", "8", "88", "66", "88", "7777"]
Biorąc to powolna, \d
dopasowuje dowolną cyfrę. Jest w drugiej grupie przechwytywania, więc \2*
dopasowuje kolejne wystąpienia tej samej cyfry. To daje tablicę, która wygląda jak
[["6", "6"], ["88", "8"], ["555", "5"], ["8", "8"],
["88", "8"], ["66", "6"], ["88", "8"], ["7777", "7"]]
Ponieważ chcemy tylko pierwszy element w każdym z tych tablic podrzędnych możemy zebrać je wszystkie z map(&:first)
.
(Zauważ, że str.scan(/(\d)\1*/)
po prostu produkować tablicę z pierwszego grupy przechwytywania, co oznacza, że mamy tylko jedną cyfrę od sekwencji ewentualnie wielokrotnych numerów.)
Nie sądzę o 'split' metoda zadziała, ponieważ usuwają one znaki, które są dopasowane przez "split". Myślę, że możesz potrzebować iteracji zamiast napisu. – Oliver