2014-11-03 3 views
2

Существует метод в приложении старых рельсов. он может преобразовать строку в массив с помощью регулярного выражения.синтаксический анализ строки регулярным выражением

Так же, как это:

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

+0

Это старая система, я также думаю, что json или yaml лучше, если я это сделаю, мне нужно переписать много кода, но не хватает времени. – pangpang

+0

О, ладно, я думал, что есть проблема с производительностью или что-то еще. Эти устаревшие коды .. – Yana

ответ

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

делают последние группы необязательно путем добавления ? должны сделать его совместимым с предыдущей версией.

(?:\+(?<max>\d+))? не является обязательным, так что старое совпадение строк также.

См. Демонстрационную версию.

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

+0

очень приятно !!! Благодарю. Думаю, мне нужно потратить время на изучение регулярных выражений. – pangpang

+0

@liuzxc ваше регулярное выражение хорошо. Просто сделайте последнюю строку необязательной. – vks

Смежные вопросы