旧的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 :(得分:3)
((?<name>\w+)\+(?<percent>\d+)%\+(?<num>\d+)(?:\+(?<max>\d+))?
通过添加?
使最后一组成为可选项,以使其与先前版本兼容。
(?:\+(?<max>\d+))?
是可选的,因此旧的字符串匹配。
参见演示。