使用正则表达式在Ruby中读取文件

时间:2013-01-16 04:28:34

标签: ruby regex file

我正在做一个类似这样的程序的项目:

  • 用户输入他们想要的最小和最大难度。
  • 程序读取包含问题和答案的文件,并根据困难打印问题。
  • 用户回答问题。
  • 将用户的答案与实际答案进行比较。

该文件如下所示:

D 1
Q What color are the clouds? 
A white
D 2 
Q What is 3 + 4? 
A 7

说我只想抓住D 1个问题和答案。我必须构建可以读取D 1和接下来的两行(QA)的正则表达式。这是我到目前为止所提出的:

if(File.exists?("quiz.txt"))
  myFile = File.open("quiz.txt")
  array = Array.new
  i = 0
  q = nil
  d = nil
  a = nil
  answer_array = Array.new
  myFile.each{|line| 
    if(line =~ (/^D #{minimum}/ =~ line || /^D #{maximum}/ =~ line))
      d = line
      d.slice!(0..1)
     if(/^Q/ =~ line)
       i= i+1
       q = line
       q.slice!(0..1)
     end
      if(/^A/ =~ line)
        a = line
        a.slice!(0..1)
      end
    end
    }

我所拥有的不起作用。第一个if语句,用于检查类似的开头是否以D开头,其他两个if语句必须始终为true,但它们也有阅读下一行,该行必须在D if语句之外。我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

Ruby的Enumerable有一个很棒的方法slice_before

file = [
  'D 1',
  'Q What color are the clouds?',
  'A white',
  'D 2',
  'Q What is 3 + 4?',
  'A 7'
]

file.slice_before(/^D/).select{ |a| a.first[/^D 1/] }
=> [["D 1", "Q What color are the clouds?", "A white"]]

slice_before适用于数组或可枚举,因此请使用File.open之类的内容来执行此操作。另一种方法是使用File.read('path/to/file').split("\n")File.readlines创建一个数组,但您也可以使用open并让Ruby对返回的枚举器起作用:

File.open('path/to/file').slice_before(/^D/).select{ |a| a.first[/^D 1/] }

答案 1 :(得分:1)

Ruby的each_slice在这里也很有用;

File.open("test.txt").each_slice(3) do |(d, q, a)|
  if d > min && d < max
     ...
  end
end

希望这有帮助!