2011-12-14 13 views
1

私は検索して検索しましたが、私はこれをどうやってやっているのか分かりません。 Regexを使ってテキストファイルの "ブロック"から "イメージ名"を取得しようとしています。複数行グループRegex c#

begin block Block_test\n( (?<image>.*?) (.*?\n))*end block 

しかし:この正規表現を使用して

begin block Block_test 
    LowFlight_005_001 strip_id 5 
    LowFlight_005_002 strip_id 5 
    LowFlight_006_005 strip_id 6 
    LowFlight_006_004 strip_id 6 
    LowFlight_006_003 strip_id 6 
    LowFlight_006_002 strip_id 6 
    LowFlight_006_001 strip_id 6 
    LowFlight_007_001 strip_id 7 
    LowFlight_007_002 strip_id 7 
    LowFlight_007_003 strip_id 7 
    LowFlight_007_004 strip_id 7 
    LowFlight_007_005 strip_id 7 
    LowFlight_007_011 strip_id 7 
    LowFlight_007_012 strip_id 7 
    LowFlight_007_013 strip_id 7 
    LowFlight_007_014 strip_id 7 
end block 

:ここでは、テキストは次のようになります!指定されたグループ画像は常に最後の画像、つまりLowFlight_007_014です。各行からイメージを選択するにはどうしたらいいですか?私は複数行フラグを使用して試したし、挿入行が始まりますので、同様に終了します。

begin block Block_test\n(^ (?<image>.*?) (.*?$\n))*end block 

は役立ちません。正規表現ウィザードを助けてください!私はこれのためのアカウントを作成しました。もちろん、イメージのリスト全体を取得し、改行で分割してから文字列配列を整理することはできますが、科学のために正規表現ですべてを行うことが大好きです!

+0

はですブロック全体を正規表現し、その正規表現を正規表現する唯一の方法は? – stereotypeaura

+0

これを読んでいる:www.regular-expressions.info/captureall.html – stereotypeaura

+0

私はこれについては分かりませんが、窓があれば\ n助けにはならないかもしれません:\ r \ n - 私はあなたができると思うでしょうそれを削除するか、{0-2} の正規表現ツールを使用していますか?私はhttp://www.radsoftware.com.au/regexdesigner/を使用しています。 – penguat

答えて

1

することは、私は考えることができる最も簡単な正規表現は次のようになります。

new Regex(@" (?<image>\w*) "); 

複数の一致をキャプチャし、それぞれに1つの「画像」グループが含まれます。

複数のブロックを1つの入力で考える必要がある場合は、複数の正規表現を使用してブロックに分割し、画像を見つける必要があると思われます。

あなたはブロック内の行から画像のみを検索する必要がある場合は、あなたの答えはあなたのコメントにあるように思わ:

begin block Block_test\r\n( (?<image>.*?) (.*\r\n))*end block 

あなたは\ wを使用して検討するかもしれないけれども:

begin block Block_test\r\n( (?<image>\w*) (.*\r\n))*end block 
0

はこれで試してみてください:

begin block Block_test(?'body'.*?)end block 

という名前gropuの体 "でテストを捉えるが、RegexOptions.SingleLineを指定するために覚えています。 はさえ、単一行オプションを使用すると、使用することができます。

begin block Block_test(\s+\S+\s+\S+\s\d)+ 

は、ブロックごとにキャプチャを持っています。あなたは、ファイル内の他の行、または複数のブロックを心配する必要がない場合は

+0

ええと...体を取得しますが、私は個々の画像を必要としますが、名前付きグループは分割できませんか?あるいは、個々のイメージ名を取得するために体の別の正規表現を実行することをお勧めしますか? – stereotypeaura

+0

@stereotypeaura私は返信をアップグレートしました –

0

私は、このタスクを分割するだろう、何

この程度
String Block = "Begin block Block_test\n" + 
" LowFlight_005_001 strip_id 5\n" + 
" LowFlight_005_002 strip_id 5\n" + 
" LowFlight_006_005 strip_id 6\n" + 
" LowFlight_006_004 strip_id 6\n" + 
" LowFlight_006_003 strip_id 6\n" + 
" LowFlight_006_002 strip_id 6\n" + 
" LowFlight_006_001 strip_id 6\n" + 
"end block"; 

String[] lines = Regex.Split(Block, @"[\r\n]+"); 
Regex reg = new Regex(@"^\s*(?<image>.*?)\s+(.*?$)"); 

foreach (String item in lines) { 
    if (!(item.StartsWith("Begin") || item.StartsWith("end"))) { 
     Console.WriteLine(item); 
     Match result = reg.Match(item); 
     Console.WriteLine(result.Groups["image"]); 
    } 
} 
Console.ReadLine();