我在纯文本文件中有这些字段。
Style 130690 113
Price $335.00
Stock # 932811
如何使用正则表达式和名称捕获将样式编号,价格和库存编号保存在单独的变量中?
我已经尝试过了,但是没有用。
fields = params[:plain].match(/"Price $"(?<price>)/)
答案 0 :(得分:2)
style, price, stock = <<~_.scan(/^(?:Style |Price \$|Stock \# )(.+)/).flatten
Style 130690 113
Price $335.00
Stock # 932811
_
# => "130690 113", "335.00", "932811"
答案 1 :(得分:1)
我假设“样式”,“价格”和“股票”的属性顺序以及它们的关联值未知。然后可以如下初始化变量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}
答案 2 :(得分:0)
问题的条件是这是文本文件的内容。因此,您可以尝试这样。
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"