2011-11-13 103 views
0

有人可以帮助我匹配模式吗?我需要从这个字符串中获取数字在Ruby中匹配正则表达式

TASK REMAINING TOTAL changed from [0.0] to [1.5], TASK ESTIMATE TOTAL changed from [0.0] to [5.0], PLAN ESTIMATE added [5.0 Points] 

我需要在TASK ESTIMATE TOTAL之后得到完全相同的数字。所以,它应该是在正则表达式中,但不在比赛中。

+1

有没有一个很好的API来访问这些数据?你为什么屏幕抓取这个工具? (Rally?FogBugz?) – Phrogz

+0

@Progro这是集会。 API以这种格式提供修订。 – damluar

回答

3

此正则表达式将得到的数字为您提供:

/\[(\d+(?:\.\d+)?)\]/ 
  1. 查找开口支架
  2. 捕获1个或多个数字
  3. 如果有一个点就必须跟1个或多个数字,并抓住了这个藏汉
  4. 发现右括号

更新:

TASK ESTIMATE TOTAL changed from \[(\d+(?:\.\d+)?)\] to \[(\d+(?:\.\d+)?)\] 

第一个数字将存储在group1中,第二个数字将存储在group2中。

s = "TASK REMAINING TOTAL changed from [0.0] to [1.5], TASK ESTIMATE TOTAL changed from [0.0] to [5.0], PLAN ESTIMATE added [5.0 Points]" 
pattern = /TASK ESTIMATE TOTAL changed from \[(\d+(?:\.\d+)?)\] to \[(\d+(?:\.\d+)?)\]/ 

if s =~ pattern 
    print "value1 = ", $1, ", value2 = ", $2 
end 

输出:

value1 = 0.0, value2 = 5.0 

看到它在这里的行动:http://codepad.org/mYARv7Zr

+0

问题更新 – damluar

+0

@damluar查看更新回答 – Marcus

+0

谢谢!我以为我必须用后视。为什么它能够工作,你能解释一下吗? – damluar

1

试试这个:

s = "TASK ESTIMATE TOTAL changed from [0.0] to [5.0]" 
s.scan(/\d+(\.\d+)?/) 
#=> ["0.0", "0.5"] 

如果你需要浮点数,你可以添加

.map(&:to_f) 
+0

也许你应该把表达式改成'/ \ d +(\。\ d +)?/',因为当前的可能会接受像'5..2..3.2.1'这样的无意义。 (不太可能,但可能,但仍然没有上下文。) – Ryan

+0

好点,更新 –

+0

问题更新 – damluar

0

正则表达式

\[([\d\.]+)\] 

在红宝石

string.match(/\[([\d\.]+)\]/)