我是Ruby的新手,我想从匹配正则表达式的文件中选择一些行然后存储到列表中。
所以我写下面的代码:
def get_valid_instr istream
p istream.select { |line| line.scan(/(^\s*\w+\s*;\s*\w+\s*$)/){|instr| instr[0].upcase.strip.split(";")}}
end
trace_instr = File.open("#{file_name}", "r"){|stream| get_valid_instr stream}
输出只是所有文件的显示。 如果我在扫描块中打印,我会看到我想要的。 还有其他方法可以做到这一点(填写外部列表),但我想知道为什么它不起作用,如果有红宝石的方式。
答案 0 :(得分:2)
如果您将一个块传递给scan
,它将返回与您不相同的内容:
"abc".scan(/./)
# => ["a", "b", "c"]
"abc".scan(/./) {|l| puts l }
# a
# b
# c
# => "abc"
使用scan
时需要注意这一点。
然而,比您当前的解决方案更好的是使用grep
。您可以将两者正则表达式和块传递给grep
。
答案 1 :(得分:0)
查看要测试的一些数据会很有帮助。
数据是否按行拆分?我不确定你用分号分裂。这是什么原因?如果您可以发布一些示例数据和一些示例输出,我将能够进一步提供帮助。
这是我试图解释你想要实现的目标,但它可能会很好,因为我没有看到真正的数据。谢谢!
def get_valid_instr(lines)
regex = /(^\s*\w+\s*;\s*\w+\s*$)/
lines.inject([]) do |matched_lines, line|
if match = line.match(regex)
p match[0]
matched_lines << match[0].upcase.strip.split(";")
end
matched_lines
end
end
trace_instr = get_valid_instr(File.readlines(file_name))
pp trace_instr
答案 2 :(得分:0)
def get_valid_instr istream
istream.grep(/^\s*\w+\s*;\s*\w+\s*$/).map do |instr|
instr.upcase.strip.split(";")
end
end