2011-08-09 12 views
3

私はこのテキストを含むテキストファイルがあります:私はちょうど========================間のすべてを取得したいルビーの2つの文字列の間でテキストを取得する方法は?

What's New in this Version 
========================== 
-This is the text I want to get 
-It can have 1 or many lines 
-These equal signs are repeated throughout the file to separate sections 

Primary Category 
================ 

を==とPrimary Categoryを作成し、そのブロックを変数に格納します。任意のアイデア

f = File.open(metadataPath, "r") 
    line = f.readlines 
    whatsNew = f.match(/==========================(.*)Primary Category/m).strip 

未定義のメソッド `マッチ」

:NoMethodError、私は次の試合の方法が働くだろうと思ったが、それは私を与えますか?前もって感謝します。

+0

ruby​​ regexpsがperlのように振る舞う場合は、// m修飾子ではなく//を使用します。 \ nも含めてください。 // m(少なくともperlで)は、^と$がどのようにマッチするかを変更するものです。 –

答えて

4

fは、ファイルディスクリプタです。ファイル内のテキストは、lineに読み込まれます。ただ1つの文字列にそれを読むために私は(への正規表現するのは難しいです)配列にテキストを読むのではなく、行うことを好むです:

-This is the text I want to get \n-It can have 1 or many lines\n-These equal signs are repeated throughout the file to separate sections" 

contents = File.open(metadataPath) { |f| f.read } 
contents.match(/==========================(.*)Primary Category/m)[1].strip 

最後の行には、ご希望の出力を生成します

+0

これはトリックでした!ありがとう! – Abdulla

0
f = File.open(metadataPath, "r") 
line = f.readlines 
line =~ /==========================(.*)Primary Category/m 
whatsNew = $1 

あなたは洗練検討する必要があります。*それは

0

貪欲かもしれないとあなたの問題はreadlinesはあなたにstrinの配列を与えるということですが、 gs(各行に1つ)ですが、使用する正規表現には1つの文字列が必要です。私が取ると思いアプローチがラインに読み込まれ

lines = File.readlines(metadataPath) 
puts lines.join[/^=+(.*?)Primary Category/m] 
# => ========================== 
# => -This is the text I want to get 
# => -It can have 1 or many lines 
# => -These equal signs are repeated throughout the file to separate sections 
# => 
# => Primary Category 
0

contents = File.read(metadataPath) 
puts contents[/^=+(.*?)Primary Category/m] 
# => ========================== 
# => -This is the text I want to get 
# => -It can have 1 or many lines 
# => -These equal signs are repeated throughout the file to separate sections 
# => 
# => Primary Category 

か、正規表現を適用する前に、単一の文字列に行を連結することができます:あなたは1つの文字列としてファイルを読むことができます(Array#find_indexを使用して)行番号が一連の等号であることを確認し、次のロットの等号の前(または2行前)の行に等号の後に行をチャンクにグループ化します(おそらくEnumerable#each_cons(2)およびmap)。そうすれば、セクションの見出しが変わってもあまり変更する必要はありません。

関連する問題