2011-12-14 27 views
6

Mam ciąg znaków "111221" i chcę dopasować wszystkie zestawy następujących po sobie równych liczb całkowitych: ["111", "22", "1"].Dopasowywanie sekwencji kolejnych znaków w ciągu znaków

Wiem, że istnieje specjalna rzecz, aby to zrobić, ale nie pamiętam i jestem okropny w Google.

+1

Co powinno się zdarzyć, gdy wejście ma znaków bez cyfr, np '" 111aaa222 "' i '" 111aa111 "'? – Phrogz

Odpowiedz

10

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"] 
+1

Twoja "zabawna" pasowałaby do "00aa00" jako ["000000"] - działa na przykładowym wprowadzeniu, ale nie na żadnych nietrywialnych przykładach. – klochner

+0

@klochner Ack! Masz rację. Naprawiono, dzięki. – Phrogz

-2

można spróbować to

string str ="111221"; 
string pattern [email protected]"(\d)(\1)+"; 

Nadzieja może pomóc

+1

Potrącony, ponieważ a) to nie działa (potrzebujesz '*' zamiast '+') oraz b) nie jest to składnia Ruby i nie działa bezpośrednio w Ruby. – Phrogz

Powiązane problemy