Ruby从字符串中获取数字

Ruby从字符串中获取数字,ruby,arrays,regex,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, 14

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

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]
试试看:

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

对于这种复杂的东西,我认为应该使用正则表达式,比如

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

您可以使用帮助计算正则表达式

由于看起来您正试图解析一个相当复杂的字符串,并从该字符串中的“字段”中获取一组特定的数字,因此使用正则表达式是一种很好的方法

确定正则表达式到底需要什么的最佳工具之一是Rubular

如果您不熟悉使用正则表达式解析字符串,请参阅文档中的正则表达式类

例如,下面的正则表达式会将这些数字中的每一个都放入相应的变量中

^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+)$
^昨天:(?[-]*\d+.\d+)\。当前:\*(?[-]*\d+.\d+.*\。更改:\*(?[-]*\d+.\d+.*\。更改2:\*(?[-]*\d+.%\\\。高:(?[-]*\d+.\d+)。低:(?[-]*\d+.\d+)$

你从哪里得到这么奇怪的字符串?我相信你是从
change\u 2
中检索
2
而不是
*5.15%*
@Robin……是的,就是这样。我如何检索5.15而不是2字符串格式没有变化?只有数字?最简单的方法:)d=c.map{x | x.scan(/[\d\-]+/).last}.map(&:to\u f)您后来将
添加到了\u f
调用中,不是吗?您应该调整输出。这将返回数字数据,但结尾带有星号…调用
会使其消失。
^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+)$