0

一些样本输入

中奖号码:1
中奖号码:1,2,3,4
中奖号码:1,23,28,273,191

所需的匹配

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

这是一个简单的模式,但我不确定如何匹配所有数字。我在想类似“获取第一个数字,然后是零个或多个数字,前面有逗号和可能的空格”

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

但它只匹配第一个(如预期的那样)和最后一个数字。

我正在使用 ruby​​,所以我希望能够检索数组中的所有匹配项并将其传递出去。使用我当前的正则表达式,它匹配最后一个数字,但它也匹配逗号,因为它在括号内。

我的逻辑有问题吗?还是我没有正确地将其表达为正则表达式?
我正在使用rubular来测试我的正则表达式。

4

2 回答 2

4

You can use scan method to match all numbers and then map them into the array with converting each one to integer using to_i

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

numbers.scan(/\d+/).map(&:to_i)
 => [1, 23, 28, 273, 191]
于 2012-05-12T23:59:35.447 回答
0

原始答案效果很好,但我总是担心有一天,有人会更改消息文本以包含一个数字。

这是另一种可以做到的方式:

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]

当然,这也包含一个假设,即该行中总是正好有 1 个冒号,并且它将结束描述文本。

于 2016-05-23T11:26:16.923 回答