2011-07-01 17 views
0

誰も私にこれを手伝ってもらえますか?Regexでラベル付きのパラメタ文字列を解析する

ここでの目的は、テキストファイルから情報を取得し、その情報をユーザーに提示し、その情報を置き換えて新しい出力を生成することです。だから私は正規表現を使うことを考えました。

私の変数のフォーマットは、{@<num>[|<value>]}です。ここで

は、いくつかの例があります:ときのようなものを除いて、\{\@(\d{1,})(?:\|{1}(.+))*\}

ocasionsのほとんどにかなりうまく機能:

{@1}<br> 
{@2|label}<br> 
{@3|label|help}<br> 
{@4|label|help|something else}<br><br> 

だから、いくつかの研究と実験の後、私はこの表現を思い付きましたこの2 & 3は、単一の発生にはなく2つのSに一致している。この場合の変数は

{@1} some text {@2|label} some more text {@3|label|help} 

別の一致が...

私はすでに表現の末尾に}のためにlookaheadコマンドを使用しようとしましたが、それを得ることはできませんでした。 C#では

\{\@(\d+)(?:\|[^|}]+)*\} 

MatchCollection matches = Regex.Matches(mystring, 
             @"\{\@(\d+)(?:\|[^|}]+)*\}"); 

それは防ぎ

私は、それがさらに

+2

'(。+)'の代わりに ''(。+?) ''を使用してみましたか? – Howard

答えて

0

使用できる正規表現は、これは任意の終値}上で読んで防ぐことができます

\{\@(\d+)(?:\|([^|}]+))*\} 

ようなものになるだろう。

もう1つの考えられる解決策(少し違う動作)は、欲張りバージョン(.+)の代わりに非貪欲なマッチャー(.+?)を使用することです。

注:私も{1}を削除し、{1,}+に置き換えました。これはあなたのケースでは同等です。

+0

もうまくいった! もう少し洗練されています。各引数はすでに分割されています。私の意見では、完璧な解決策。ありがとう! – Suriv

0

はこれを試してみてください...誰も助けなければならないのC#に使用するため、この表現をターゲットにしていますラベルを付けて|または}を食べるのを助けてください。

match[0].Value => {@1} 
match[0].Groups[0].Value => {@1} 
match[0].Groups[1].Value => 1 
match[1].Value => {@2|label} 
match[1].Groups[0].Value => {@2|label} 
match[1].Groups[1].Value => 2 
match[2].Value => {@3|label|help} 
match[2].Groups[0].Value => {@3|label|help} 
match[2].Groups[1].Value => 3 
+0

うまくいきませんでした... 私は変数の数値引数を持つグループを1つだけ取得します。しかし、それは私のバグを修正します:) – Suriv

+0

@サリヴ、私はあなたがしようとしていることを理解していないと思います。正しくエスケープされると、私の正規表現は、あなたの例で3つの括弧つきタグと一致します。それは最初のグループに番号を入れます。私の更新された答えを見てください。 –

1

私はこの1つの結果が気に入ら:

\{\@(\d+)(?:|\|(.+?))\} 

これは3つのグループを返します。 2番目のグループは数字(1,2,3)で、3番目のグループは引数( 'label'、 'label | help')です。

*を削除して、最後のグループ化の最初のパイプの後にすべての引数を取り込むことを好む場合は|を優先します。

+0

それは動作します!ありがとう! 私は2つのグループを取得します.1つは名前を付け、もう1つはargsを使用して、「|」を分割します。 – Suriv