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 № 1Você 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.