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 № 1Moż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.