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}

出力は、単にすべてのファイルの表示です。スキャンブロックにプリントを入れると、欲しいものが正確にわかります。それを行う方法は他にもありますが(外部リストに入力する)、なぜそれが機能しないのか、そしてルビーの方法があるのだろうかと思います。

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 に答える