2014-11-03 85 views
2

舊的rails應用程序中有一種方法。它可以通過正則表達式將字符串轉換爲數組。通過正則表達式解析字符串

就像這樣:

irb(main):047:0> string = "[(a+50%+1)(b+60%+2)]" 
=> "[(a+50%+1)(b+60%+2)]" 
irb(main):048:0> string.scan(/\((?<name>\w+)\+(?<percent>\d+)%\+(?<num>\d+)\)/) 
=> [["a", "50", "1"], ["b", "60", "2"]] 

但要求改變時,我有一個新值添加到字符串。

我可以把它像這樣:

irb(main):049:0> string = "[(a+50%+1+100)(b+60%+2+200)]" 
=> "[(a+50%+1+100)(b+60%+2+200)]" 
irb(main):050:0> string.scan(/\((?<name>\w+)\+(?<percent>\d+)%\+(?<num>\d+)\+(?<max>\d+)\)/) 
=> [["a", "50", "1", "100"], ["b", "60", "2", "200"]] 

但它不能與以前的兼容,

irb(main):051:0> string = "[(a+50%+1)(b+60%+2)]" 
=> "[(a+50%+1)(b+60%+2)]" 
irb(main):052:0> string.scan(/\((?<name>\w+)\+(?<percent>\d+)%\+(?<num>\d+)\+(?<max>\d+)\)/) 
=> [] 

有沒有更好的方式來做到嗎?請幫助,提前致謝!

+0

哇,我不知道它可以這樣工作。無論如何,你爲什麼不使用json或yaml?脫離主題。只是好奇 – Yana 2014-11-03 08:55:54

+0

這是一箇舊系統,我也認爲json或yaml更好,如果我這樣做,我必須重寫很多代碼,但沒有足夠的時間。 – pangpang 2014-11-03 09:01:00

+0

哦好吧,我認爲有一個性能問題或任何事情。那些遺產代碼.. – Yana 2014-11-03 09:18:47

回答

3
((?<name>\w+)\+(?<percent>\d+)%\+(?<num>\d+)(?:\+(?<max>\d+))? 

通過添加?使最後的組可選可以使其與以前的版本兼容。

(?:\+(?<max>\d+))?是可選的,所以舊字符串匹配。

查看演示。

http://regex101.com/r/sX5xT6/1

+0

非常好!謝謝。我想我必須花時間學習正則表達式。 – pangpang 2014-11-03 08:55:36

+0

@liuzxc你的正則表達式是很好的。只要最後一個字符串是可選的。 – vks 2014-11-03 08:56:39