3

テキストの一部を取得するためにtrue if、フリップフロップの前でクラッジを使用しています。

desired_portion_lines = text.each_line.find_all do |line|
  true if line =~ /start_regex/ .. line =~ /finish_regex/
end
desired_portion = desired_portion_lines.join

ビットを削除するtrue ifと、文句を言います

範囲の値が正しくありません (ArgumentError)

ぎこちなくすることは可能ですか、それとも単にするべきですか

desired_portion_lines = ""
text.each_line do |line|
  desired_portion_lines << line if line =~ /start_regex/ .. line =~ /finish_regex/
end

または、列挙を使用しないより良いアプローチはありますか?

4

3 に答える 3

1

あなたがそれを行ごとにやっているなら、私の好みはこのようなものです

line =~ /finish_regex/ && p=0
line =~ /start_regex/ && p=1
puts line if p

オールインワンのストリングがある場合。私は分割を使用します

mystring.split(/finish_regex/).each do |item|
  if item[/start_regex/] 
     puts item.split(/start_regex/)[-1]
  end
end
于 2011-02-21T00:39:43.210 に答える
1

おもう

desired_portion_lines = ""
text.each_line do |line|
  desired_portion_lines << line if line =~ /start_regex/ .. line =~ /finish_regex/
end

完全に受け入れられます。この..演算子は非常に強力ですが、多くの人には使用されていません。おそらく、演算子の機能を理解していないためです。使い慣れていないため、奇妙またはぎこちなく見えるかもしれませんが、次第に慣れていきます。これは、Perl でテキスト ファイル内の行の範囲を処理するときに非常に一般的であり、私が最初に遭遇した場所であり、最終的には頻繁に使用していました。

私が別の方法で行う唯一のことは、括弧を追加して、論理テストを互いに、および行の残りの部分から視覚的に分離することです。

desired_portion_lines = ""
text.each_line do |line|
  desired_portion_lines << line if ( (line =~ /start_regex/) .. (line =~ /finish_regex/) )
end

Ruby (および Perl) のコーダーは括弧の使用を嫌うようですが、論理テストを視覚的に分離するのに役立つと思います。私にとってそれは読みやすさであり、ひいてはメンテナンスのことです。

私が考えることができる唯一の他のことは配列に変更desired_portion_linesして、選択した行をその上にプッシュすることです。現在、desired_portion_lines << line文字列への追加を使用して、毎回変更しています。配列をプッシュしてから、後でその要素を結合して文字列を作成する方が速い場合があります。

最初の例に戻ります。私はこれをテストしませんでしたが、次のように単純化できると思います。

desired_portion = text.each_line.find_all { |line| line =~ /start_regex/ .. line =~ /finish_regex/ }.join

フリップフロップを使用してファイル内のすべての行を反復することの唯一の欠点は、開始パターンが複数回発生する可能性がある場合、見つかった各ブロックが に追加されることdesired_portionです。

于 2011-02-21T03:01:42.103 に答える