通过正则表达式解析字符串

时间:2014-11-03 08:45:06

标签: ruby-on-rails ruby regex

旧的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+)\)/)
=> []

有更好的方法吗?请帮助,提前谢谢!

1 个答案:

答案 0 :(得分:3)

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

通过添加?使最后一组成为可选项,以使其与先前版本兼容。

(?:\+(?<max>\d+))?是可选的,因此旧的字符串匹配。

参见演示。

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