Użycie wyrażenia regularnego w Ruby 1.8.7+:
p s.scan(/((\d)\2*)/).map(&:first)
#=> ["111", "22", "1"]
To działa, ponieważ (\d)
rejestruje każdą cyfrę, a następnie \2*
przechwytuje zero lub więcej z dowolnej grupy (drugi nawias otwierający). Zewnętrzny (…)
jest potrzebny do przechwycenia całego meczu w wyniku w scan
. Wreszcie scan
same zwroty:
[["111", "1"], ["22", "2"], ["1", "1"]]
... więc trzeba uruchomić i utrzymać tylko przez pierwszy element każdej tablicy. W Ruby 1.8.6+ (który nie posiada Symbol#to_proc
dla wygody):
p s.scan(/((\d)\2*)/).map{ |x| x.first }
#=> ["111", "22", "1"]
bez żadnych Regex, tu jest zabawa jeden (dopasowania dowolnego char), który działa w Ruby 1.9.2:
p s.chars.chunk{|c|c}.map{ |n,a| a.join }
#=> ["111", "22", "1"]
Oto kolejna wersja, która powinna działać nawet w Ruby 1.8.6:
p s.scan(/./).inject([]){|a,c| (a.last && a.last[0]==c[0] ? a.last : a)<<c; a }
# => ["111", "22", "1"]
Co powinno się zdarzyć, gdy wejście ma znaków bez cyfr, np '" 111aaa222 "' i '" 111aa111 "'? – Phrogz