比如"Buy a cup for $30"
要匹配里面的“30”,但前置条件是“30”前必须有"$", 正则表达式是这样:/(?<=\$)[0-9.]+/,这个已知。
但字符串偶尔可能会是“Buy a cup for $ 30”,即“$”和“30”间可能偶尔有空格,正样的情况正则该如何写才能依旧匹配上“30”并符合前述条件呢?
貌似直接把*?+写在零宽正向后行断言 (坑爹的名字) 不能用
这个应该能满足要求,正则很弱,也许有更好的写法
"Buy a cup for $ 30".match(/(?<=\$)\s*[0-9.]+/)[0].strip
"Buy a cup for $ 30, Buy a cup for $30.0, Buy a cup for $ 30.00.".scan(/\$\s*(\d+(?:\.\d+)?)/) do |money|
puts money[0]
end
不过1..10
这样的数字也会被匹配上,ft。。。
首先要相信一点,Ruby 1.9 的正则 已经是最强大的了。理论上没有实现不了的。
类似需求我最近刚处理过,当时是希望把我的笔记中所有 `内容'
左右两个符号添加空格分隔,因为无法回溯的缘故,需要用到 Ruby1.9 支持的 子正则表达式
, 类似格式:(?>=INNER)
刚看到手册 slice 那一节,刚好 slice 也支持正则 irb(main):050:0> "Buy a cup for $ 30xxxxxx".slice(/\$\s*(\d+)/,1) => "30" 跟 5 楼的实现方式差不多
搭车问个问题,是不是 str[] 等效于 str.slice()