Newb正则表达式问题 - Ruby 1.9.2

时间:2010-12-06 21:56:47

标签: ruby-on-rails ruby regex

我对编程非常陌生,特别是Ruby,而且我一直在使用正则表达式。

我所拥有的是如下字符串:

s = 'Your Product Costs $10.00'

我要做的是写一个表达式,所以我的匹配数据只等于价格,例如我已经能够做到以下几点。

r = /[$]\d....\Z/

因此

match = r.match s
 => #<MatchData "$10.00"> 

我的问题是,如果产品价格是100.00美元。好吧,我没有足够的外卡,我的比赛是零。

在那里有正则表达式,说“直到字符串结尾的外卡?”或“外卡直到[字符]”或者我必须找到一个字符串的长度,找到我的$字符的位置,并根据每个输入计算它?

感谢。

3 个答案:

答案 0 :(得分:3)

与金额匹配的正则表达式,并确保匹配是实际数字而不是连续的数字或随机字符:

/\$([1-9]\d*|0)(\.\d{1,2})?/

匹配$123.1$123.12$123$0.12等。

$01.12$12.等不匹配。

进一步阅读:http://www.regular-expressions.info/

答案 1 :(得分:2)

这是你想要的正则表达式:

\$(\d+\.\d+)

要测试的ruby代码:

str1 = 'Your Product Costs $10.00'
str2 = 'Your Product Costs $100.00'

regexp = /\$(\d+\.\d+)/

regexp.match str1   # => <MatchData "$10.00" 1:"10.00">
regexp.match str2   # => <MatchData "$100.00" 1:"100.00">

关键是要检查.。有一个很棒的网站可以测试你的正则表达式:http://rubular.com/

答案 2 :(得分:1)

也许你想要这个?

r = /\$\d+\.\d{1,2}/

s = 'Your product costs $10.00'
s2 = 'Your product costs $1000.00'

r.match s
 => #<MatchData "$10.00"> 

r.match s2
 => #<MatchData "$1000.00"> 

它在点之前接受任意数量的数字,在点之后接受一到两位数字。您可以在{1,2}部分更改此设置。请注意,如果将其更改为0,则必须使点可选。

小数点后面的点和数字都可选:

r = /\$\d+(?:\.\d{1,2})?/

s = "Anything blabla $100060"
r.match s
 => #<MatchData "$100060">"

小数点后的位数不受限制:

r = /\$\d+\.\d+/

s = "Product price is: $1560.5215010"
r.match s
 => #<MatchData "$1560.5215010"> 

小数点后的数字位数不受限制且可选点:

r = /\$\d+(?:\.\d{1,})?/

s = "Product price is: $1500"
s2 = "Product price is: $19.921501"

r.match s
 => #<MatchData "$1500"> 

r.match s2
 => #<MatchData "$19.921501">