一些样本输入
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来测试我的正则表达式。
答案 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个冒号,它将结束描述文本。