2011-07-10 9 views
0

私は以下のようになっている指定されたパターンから特定の情報を解析する:正規表現

/root/test/subfolder/ 
relative/folder/ 
index.html 
/root/test/style.css 
test/test2/test3/testN/ 

私は正規表現を作成したが、それはテスト/のみ、ルート/のような複数の文字列と一致していません最後のインスタンス。私のコード:

Regex re = new Regex(@"^(/?)([\w\.]+/)*([\w\.]+)?$"); 

foreach (Group gr in re.Match("/templates/base/test/header.html").Groups) 
    Console.WriteLine(gr + " @ " + gr.Index.ToString()); 

Console.ReadKey(); 

は、私が最後で最後に/を持つオプションは、パスおよびオプションのファイル名として最初のスラッシュを持っていると思います。

答えて

1

繰り返しキャプチャグループは、常に最後の繰り返しだけをキャプチャします。しかし、あなたが代わりに全体の繰り返しグループをキャプチャ(繰り返しグループの非キャプチャー括弧(?:...)を使用することができます。

Regex re = new Regex(@"^(/?)((?:[\w\.]+/)*)([\w\.]+)?$ 

これは、あまりにも、他の正規表現のフレーバーで動作する.NETはしかし、別の機能を提供しています。それは可能ですaccess the individual matches of a repeated capturing groupにあなたの正規表現の使用:。。

Match match = Regex.Match(input, @"^(/?)([\w\.]+/)*([\w\.]+)?$"); 
foreach (Capture capture in match.Groups[2].Captures) { 
    Console.WriteLine("  Capture {0}: {1}", captureCtr, capture.Value); 
    captureCtr += 1;     
} 
+0

を私はそれがまたしたい、その後/templates/test/subfolder/test.htmlのように、私はちょうど、真ん中から複数の一致を必要とする上記の例から、単一の行に一致するようにしたいですテンプレート/、テスト/サブフォルダ/ミドルグループ – aambrozkiewicz

+0

グループでキャプチャを発見しました。ありがとうございますy :) – aambrozkiewicz

+0

@alexander:ああ、OK、私はあなたの質問を誤解していました。今私の答えを編集しました。 –