我正在做一个类似这样的程序的项目:
该文件如下所示:
D 1
Q What color are the clouds?
A white
D 2
Q What is 3 + 4?
A 7
说我只想抓住D 1
个问题和答案。我必须构建可以读取D 1
和接下来的两行(Q
和A
)的正则表达式。这是我到目前为止所提出的:
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语句之外。我怎么能这样做?
答案 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
希望这有帮助!