按模式分割 ruby 文件?

Splitting a ruby file at a pattern?

我有一个包含产品数据的大型 ruby 文件。我正在尝试根据正则表达式将文件分成多个部分。我的产品 headers 由 Product 后跟 space 和数字表示。在那之后,我有一堆包含产品信息的行。

格式如下。

Product 1:

...data

Product 2:

...data

...

Product N:

...data

从文件中读取时,我想忽略产品 Headers,而只显示产品数据。为此,我尝试根据正则表达式拆分文件。

file = File.read('products.txt')
products = file.split(/\Aproduct \d+:\z/i)

此正则表达式有效并找到所有产品 headers。问题是,文件没有被拆分成适当的部分。

当我 运行 puts products[0], 时,整个文件被打印到控制台。

文件会被读取完整,没有办法避免。但是您可以遍历每一行并忽略与表达式匹配的行:

File.open("file.txt", "r") do |file|
  file.each_line do |line|
    if # condition
    #fancy stuff
    else
    # not that fancy
  end
end

\A\z 分别匹配字符串的开头和结尾。而您想要的是匹配一行的开头和结尾。相反,您应该使用 ^$ 锚点:

/^product \d+:$/i