Ruby命名为Capture

时间:2019-02-06 03:00:13

标签: regex ruby

我在纯文本文件中有这些字段。

Style 130690 113
Price $335.00
Stock # 932811

如何使用正则表达式和名称捕获将样式编号,价格和库存编号保存在单独的变量中?

我已经尝试过了,但是没有用。

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

3 个答案:

答案 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)

我假设“样式”,“价格”和“股票”的属性顺序以及它们的关联值未知。然后可以如下初始化变量stylepricestock

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 

stylestyle_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_rstock_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"