/ / Regex - correspondendo a um número arbitrário de valores (ruby) - ruby, regex

Regex - correspondendo a um número arbitrário de valores (ruby) - ruby, regex

Algumas entradas de amostra

números vencedores: 1 números vencedores: 1,2,3,4 números vencedores: 1,23, 28, 273, 191

Combinações desejadas

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

É um padrão simples, mas "não tenho certeza de como combinar todos os números. Eu estava pensando algo como" pegue o primeiro número, depois zero ou mais números precedidos por uma vírgula e possivelmente espaços "

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

Mas corresponde apenas ao primeiro (como esperado) e ao último número.

Estou usando ruby, então quero poder recuperartodas as correspondências em uma matriz e distribuí-lo. Com a minha regex atual, ele corresponde ao último número, mas também corresponde à vírgula, porque está entre parênteses.

Minha lógica é falha? Ou não estou expressando isso como uma regex corretamente?
Estou a usar rubular para testar meu regex.

Respostas:

4 para resposta № 1

Você pode usar scan método para combinar todos os números e então map eles na matriz com a conversão de cada um em inteiro usando to_i

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

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

0 para resposta № 2

A resposta original funciona bem, mas estou sempre preocupado com o fato de que, algum dia, alguém altere o texto da mensagem para incluir um número.

Esta é outra maneira de fazer isso:

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]

Claro, isso também contém uma suposição de que sempre haverá exatamente 1 dois pontos na linha e isso encerrará o texto de descrição.