我对编程非常陌生,特别是Ruby,而且我一直在使用正则表达式。
我所拥有的是如下字符串:
s = 'Your Product Costs $10.00'
我要做的是写一个表达式,所以我的匹配数据只等于价格,例如我已经能够做到以下几点。
r = /[$]\d....\Z/
因此
match = r.match s
=> #<MatchData "$10.00">
我的问题是,如果产品价格是100.00美元。好吧,我没有足够的外卡,我的比赛是零。
在那里有正则表达式,说“直到字符串结尾的外卡?”或“外卡直到[字符]”或者我必须找到一个字符串的长度,找到我的$字符的位置,并根据每个输入计算它?
感谢。
答案 0 :(得分:3)
与金额匹配的正则表达式,并确保匹配是实际数字而不是连续的数字或随机字符:
/\$([1-9]\d*|0)(\.\d{1,2})?/
匹配$123.1
,$123.12
,$123
,$0.12
等。
与$01.12
,$12.
等不匹配。
答案 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">