1

我是 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}

输出只是所有文件的显示。如果我在扫描块中打印,我会确切地看到我想要的。还有其他方法可以做到这一点(填写外部列表),但我想知道为什么它不起作用以及是否有 ruby​​ 方式。

4

3 回答 3

2

如果将块传递给scan,它将返回与不传递块不同的内容:

"abc".scan(/./)
# => ["a", "b", "c"]

"abc".scan(/./) {|l| puts l }
# a
# b
# c
# => "abc"

使用时需要注意这一点scan

但是,比您当前的解决方案更好的是使用grep. 您可以将正表达式和块传递给grep.

于 2012-05-18T13:12:10.933 回答
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
于 2012-05-18T13:07:00.080 回答
0
def get_valid_instr istream
  istream.grep(/^\s*\w+\s*;\s*\w+\s*$/).map do |instr|
    instr.upcase.strip.split(";")
  end
end
于 2012-05-18T13:28:00.113 回答