Я предполагаю, что порядок атрибутов "style", "price" и "stock" и связанных с ними значений неизвестен.Затем можно инициализировать переменные style
, price
и stock
следующим образом.
str =<<END
Price $335.00
Style 130690 113
Stock # 932811
END
#=> "Price $335.00\nStyle 130690 113\nStock # 932811\n"
style_r = /\bstyle +(?=(\d+))/i
str.match(style_r)
style = $1.to_i
#=> 130690
price_r = /\bprice +\$(?=(\d+\.\d{2}))/i
str.match(price_r)
price = $1.to_f
#=> 335.0
stock_r = /\bstock +# +(?=(\d+))/i
str.match(stock_r)
stock = $1.to_i
#=> 932811
Регулярное выражение для style
, style_r
может быть записано в режиме «свободного пробела», что делает его самодокументированным:
/
\b # match a word break
style # match string
[ ]+ # match one or more spaces
(?= # begin a positive lookahead
(\d+) # match one or more digits in capture group 1
) # end the positive lookahead
/ix # case-indifferent (i) and free-spacing modes
После совпадения наэтому регулярному выражению глобальной переменной $1
присваивается значение группы захвата 1.
В свободном интервале пробелы удаляются.Один из способов защитить их - заключить их в класс персонажей ([ ]
), что я и сделал.Интерпретация price_r
и stock_r
аналогична.
Инициализация переменных таким способом обычно не выполняется.Как правило, было бы более полезно создать хэш с ключами :style
, :stock
и :price
:
h = {}
str.match(style_r)
h[:style] = $1.to_i
str.match(price_r)
h[:price] = $1.to_f
str.match(stock_r)
h[:stock] = $1.to_i
h #=> {:style=>130690, :price=>335.0, :stock=>932811}