2012-02-15 11 views
11

Jak podzielić ten ciąg.Ruby Podziel ciąg znaków powtarzając znaki lub spację

"6885558 8866887777" => ["6", "88", "555", "8", "88", "66", "88", "7777"] 

Próbowałem tego, ale nigdy nie działało.

ruby-1.8.7-p334 :020 > "111133".split(/(\d)\1+/) 
=> ["", "1", "", "3"] 
+0

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

Odpowiedz

24

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.)

+2

+1 za doskonałe wyjaśnienie. –

+0

To było bardzo pomocne, dzięki. – Robin

Powiązane problemy