Ruby从字符串中获取数字

时间:2014-05-12 11:35:57

标签: ruby arrays regex

我有以下字符串,我想从中提取数字到数组

b="yesterday: 136.00. current: *143.00*. change: *-7.00*. change_2: *5.15%*. high: 143.00. low: 143.00" 

所以我先做了,

c = b.split(". ")
d = c.map{ |x| x.scan(/[\d\.-]+/)[0] }.map(&:to_f)

然而d返回:

[136.0, 143.0, -7.0, 2.0, 143.0, 143.0]

而不是

[136.0, 143.0, -7.0, 5.15, 143.0, 143.0]

3 个答案:

答案 0 :(得分:0)

尝试:

b.scan(/(?<=[ *])-?\d[\d.]+/).map(&:to_f)
# => [136.0, 143.0, -7.0, 5.15, 143.0, 143.0]

答案 1 :(得分:0)

b.scan(/-?\d+.\d{2}[%*.]?/).map(&:to_f)
#=> [136.0, 143.0, -7.0, 5.15, 143.0, 143.0]

答案 2 :(得分:-1)

对于这种复杂的东西,我认为你应该使用正则表达式,所以像这样

/ ^昨天:([0-9 +]).. / = ~b

您可以使用rubular帮助找出正则表达式

因为您似乎正在尝试解析一个相当复杂的字符串并从&#34;字段中获取一组特定的数字&#34;在该字符串中,一个很好的方法是使用正则表达式。

确定正则表达式需要的最佳工具之一是Rubular。

如果您不熟悉使用正则表达式解析字符串,请参阅文档中的Regex类 http://www.ruby-doc.org/core-2.1.1/Regexp.html

例如,以下正则表达式会将这些数字中的每一个都放入相应的变量中。 reqex方法稍微复杂一点,但也显示了你打算做的事情。

^yesterday: (?<yesterday>[-]*\d+\.\d+)\. current: \*(?<current>[-]*\d+\.\d+)\*\. change: \*(?<change>[-]*\d+\.\d+)\*\. change_2: \*(?<change_2>[-]*\d+\.\d+)%\*\. high: (?<high>[-]*\d+\.\d+)\. low: (?<low>[-]*\d+\.\d+)$