Ruby on rails 正则表达式匹配Ruby中成百上千的值

Ruby on rails 正则表达式匹配Ruby中成百上千的值,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,我试图找到一个工作的正则表达式,它允许我查找网页的所有价格,如1150.00和500.00 这个正则表达式在Rubular中适用于我: /(\d?,?\d+.\d+)/ 但它在我的Ruby代码中不起作用,因为它适用于数百个值,但只接受千分之一的第一个数字(例如,1150.00中的1) 有什么我遗漏的吗 这是我正在使用的代码: str_rooms_prices = rooms_container.scan(/[\d,]?\d+\.\d+\s/) puts "This is the room p

我试图找到一个工作的正则表达式,它允许我查找网页的所有价格,如
1150.00
500.00

这个正则表达式在Rubular中适用于我:

/(\d?,?\d+.\d+)/
但它在我的Ruby代码中不起作用,因为它适用于数百个值,但只接受千分之一的第一个数字(例如,1150.00中的1)

有什么我遗漏的吗

这是我正在使用的代码:

str_rooms_prices = rooms_container.scan(/[\d,]?\d+\.\d+\s/)

puts "This is the room prices I've found so far #{str_rooms_prices}."

str_rooms_prices = str_rooms_prices - ["0"]

puts "I'm now substracting the 0 prices and this is what remains: #{str_rooms_prices}."

int_rooms_prices = str_rooms_prices.map { |str| str.to_i }

min_price = int_rooms_prices.min.to_i

然后我得到的最低价格是1。

由于您将
转换为
,您得到的是
最低价格
1

'1,150.00'.to_i
=> 1
请尝试以下操作:

int_rooms_prices = str_rooms_prices.map { |str| str[0].tr(',','').to_i }
重要的是要注意,您应该将价格转换为单位,否则小数位数将丢失。因此,使用
to_f
将值转换为单位,然后乘以100得到完整值,然后可以转换为整数

int_rooms_prices = str_rooms_prices.map { |str| (str[0].tr(',','').to_f*100).to_i }
然后您可以使用显示正确的价格,如下所示:

number_to_currency(min_price/100)

由于您将
转换为\u i
,您将获得
min\u price
1

'1,150.00'.to_i
=> 1
请尝试以下操作:

int_rooms_prices = str_rooms_prices.map { |str| str[0].tr(',','').to_i }
重要的是要注意,您应该将价格转换为单位,否则小数位数将丢失。因此,使用
to_f
将值转换为单位,然后乘以100得到完整值,然后可以转换为整数

int_rooms_prices = str_rooms_prices.map { |str| (str[0].tr(',','').to_f*100).to_i }
然后您可以使用显示正确的价格,如下所示:

number_to_currency(min_price/100)

我觉得你的正则表达式太复杂了。在我看来,.]+/
就可以了。另外,您使用的是
to_i
,它会因为逗号而中断

'1,000,000.00'.to_i
#=> 1
因此,您需要首先删除这些逗号,例如使用
String#delete

'1,000,000.00'.delete(',').to_i
#=> 1000000
to_i
的另一个问题是,它将丢弃小数点,因为它将数字转换为整数:

'1.23'.to_i
#=> 1
因此,您应该使用
来代替:

'1.23'.to_f
#=> 1.23
下面是一个处理负值的完整示例:

str = "Subtracting 1,500.00 from 1,150.23 leaves you with -350.77"
str.scan(/-?[\d,.]+/).map{|s| s.delete(',').to_f }
#=> [1500.0, 1150.23, -350.77]

如果你真的不需要小数点,当然可以用
来表示。

我认为你的正则表达式太复杂了。在我看来,.]+/
就可以了。另外,您使用的是
to_i
,它会因为逗号而中断

'1,000,000.00'.to_i
#=> 1
因此,您需要首先删除这些逗号,例如使用
String#delete

'1,000,000.00'.delete(',').to_i
#=> 1000000
to_i
的另一个问题是,它将丢弃小数点,因为它将数字转换为整数:

'1.23'.to_i
#=> 1
因此,您应该使用
来代替:

'1.23'.to_f
#=> 1.23
下面是一个处理负值的完整示例:

str = "Subtracting 1,500.00 from 1,150.23 leaves you with -350.77"
str.scan(/-?[\d,.]+/).map{|s| s.delete(',').to_f }
#=> [1500.0, 1150.23, -350.77]


如果你真的不需要小数点,当然可以使用
来输入

你的捕获在哪里?你为什么不使用像
/(\d[,\d]*(\。\d{2)这样的东西/
你应该向我们展示你用来匹配的Ruby代码。A.你的正则表达式没有给我我预期的结果。看,这是我的正则表达式的一个改进版本,它在Rubular上工作,但在Ruby中又不工作:当然,Frankie,我刚刚用我的codeSamer更新了问题,你的正则表达式返回了你不想要的东西。即:匹配11,17,And 18您的捕获在哪里?您有没有理由不使用类似
/(\d[,\d]*(\。\d{2)?)/
你应该向我们展示你用来匹配的Ruby代码。A.你的正则表达式没有给我我预期的结果。看,这是我的正则表达式的一个改进版本,它在Rubular上工作,但在Ruby中又不工作:当然,Frankie,我刚刚用我的codeSamer更新了问题,你的正则表达式返回了你不想要的东西。即:匹配11,17,And 18成功了!似乎我需要学习更多的Ruby而不是正则表达式:请注意,您使用的是
to_I
(to integer),尽管匹配小数位数。除非您使用
to_f
(to float),否则这些将被截断。你完全正确@padde,这些值不应该有任何小数点。相应地更新了我的答案。谢谢!这就是诀窍!似乎我需要学习更多Ruby而不是regex:p注意,虽然匹配小数点,但您使用
to_I
(to integer)。除非使用
to_f
(to float),否则这些值将被截断.你完全正确@padde,值不应该有任何小数位。相应地更新了我的答案。谢谢!+1.简洁的正则表达式,应该是这样的,解释得很好。+1.简洁的正则表达式,应该是这样的,解释得很好。