Ruby Named Capture - PullRequest
       2

Ruby Named Capture

0 голосов
/ 06 февраля 2019

У меня есть эти поля в текстовом файле.

Style 130690 113
Price $335.00
Stock # 932811

Как сохранить номер стиля, цену и запас # в отдельных переменных, используя регулярное выражение и захват имени?

Iпробовал это, но это не сработало.

fields = params[:plain].match(/"Price $"(?<price>)/)

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Условием вопроса является то, что это содержимое текстового файла.Поэтому вы можете попробовать вот так.

ary = File.readlines(path_to_your_file, chomp: true)
style, price, stock = ary[0].sub(/Style /, ''), ary[1].sub(/Price \$/, ''), ary[2].sub(/Stock # /, '')
#=> "130690 113", "335.00", "932811"
0 голосов
/ 06 февраля 2019

Я предполагаю, что порядок атрибутов "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} 
0 голосов
/ 06 февраля 2019
style, price, stock = <<~_.scan(/^(?:Style |Price \$|Stock \# )(.+)/).flatten
Style 130690 113
Price $335.00
Stock # 932811
_
# => "130690 113", "335.00", "932811"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...