2011-11-13 135 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\.]+)\]/)