/ / Regex - dopasowywanie dowolnej liczby wartości (ruby) - ruby, regex

Regex - dopasowanie dowolnej liczby wartości (ruby) - ruby, regex

Niektóre wejścia próbek

zwycięskie liczby: 1 zwycięskie liczby: 1,2,3,4 zwycięskie liczby: 1,23, 28, 273, 191

Pożądane mecze

[1] [1, 2, 3, 4] [1, 23, 28, 273, 191]

To prosty wzorzec, ale nie bardzo wiem, jak dopasować wszystkie liczby. Myślałem o czymś w rodzaju: „zdobądź pierwszą liczbę, a następnie zero lub więcej liczb poprzedzonych przecinkiem i prawdopodobnie spacjami”

winning numbers:s*(d+)s*(,s*(d+))*

Ale pasuje tylko do pierwszej (zgodnie z oczekiwaniami) i ostatniej liczby.

Używam rubinu, więc chcę mieć możliwość odzyskaniawszystkie dopasowania w tablicy i przekaż je. W moim bieżącym wyrażeniu regularnym pasuje do ostatniej liczby, ale pasuje również do przecinka, ponieważ znajduje się w nawiasach.

Czy moja logika jest błędna? A może nie wyrażam tego poprawnie jako wyrażenie regularne?
Używam rubularny aby przetestować moje wyrażenie regularne.

Odpowiedzi:

4 dla odpowiedzi № 1

Możesz użyć scan metoda, aby dopasować wszystkie liczby, a następnie map je do tablicy, konwertując każdy z nich na liczbę całkowitą za pomocą to_i

numbers = "1,23, 28,   273, 191"

numbers.scan(/d+/).map(&:to_i)
=> [1, 23, 28, 273, 191]

0 dla odpowiedzi nr 2

Oryginalna odpowiedź działa dobrze, ale zawsze obawiam się, że pewnego dnia ktoś zmieni treść wiadomości, tak aby zawierała liczbę.

Oto inny sposób, w jaki można to zrobić:

2.3.0 :013 > def get_numbers(s)
2.3.0 :014?>   s.split(":").last.split(",").map(&:to_i)
2.3.0 :015?>   end
=> :get_numbers
2.3.0 :016 > get_numbers "winning numbers: 1,23, 28,   273, 191"
=> [1, 23, 28, 273, 191]

Oczywiście zawiera to również założenie, że zawsze będzie dokładnie 1 dwukropek w linii, co zakończy tekst opisu.