我有以下字符串,我想从中提取数字到数组
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]
答案 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+)$