正则表达式 - 匹配任意数量的值(ruby)

时间:2012-05-12 23:56:32

标签: ruby regex

一些样本输入

winning numbers: 1
winning numbers: 1,2,3,4
winning numbers: 1,23, 28,   273, 191

所需的比赛

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

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

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

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

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

我的逻辑有缺陷吗?或者我没有正确表达它是正则表达式? 我正在使用rubular来测试我的正则表达式。

2 个答案:

答案 0 :(得分:4)

您可以使用scan方法匹配所有数字,然后map将它们放入数组中,并使用to_i将每个数字转换为整数

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

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

答案 1 :(得分: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个冒号,它将结束描述文本。

相关问题