2011-01-10 2 views
0
CriteriaCondition={FieldName=**{**EPS**}**$MinValue=(-201)$MaxValue=(304)$TradingPeriod=(-1)} 

「= {」&がで終わって次の次の言葉を得る「}」最初の単語で終わる最初の単語を得るために私を助けて。私は正規表現で文字列を分割するのに役立つこと

結果がでなければなりません:

Word1 = "CriteriaCondition" 
Word2 = "FieldName={EPS}$MinValue=(-201)$MaxValue=(304)$TradingPeriod=(-1)" 

と文字列を "フィールド名=(EPS)$ MinValueプロパティ=( - 201)$ MaxValueを=(304)$ TradingPeriod =( - 1)"、私を助けてペアに分割する:

フィールド名は

をEPS MinValueプロパティ-201

MaxValueを304

TradingPeriod -1

ありがとうございました。

+0

私はあなたがきれいにregexpでそれを行うことができるとは確信していません。 2番目の一致が文字列の終わりの近くで常に終了しない限り。 –

+0

3回目に 'FieldName =(EPS)'があります。どのくらいの入れ子を期待していますか?あなたの値に '='または '$'記号をエスケープしたでしょうか?それは全体の文字列か、より大きな文字列の一部ですか? – Kobi

+0

EPSの周りの**は入力に入り、あなたはそれらを取り除きたいのですか、またはこの例ではそこに入っていますか? – R0MANARMY

答えて

1

これは.NET capturesの仕事のようです。他の多くの正規表現のフレーバとは対照的に、.NETでは、最後のものだけでなく、繰り返しキャプチャするグループのすべてのキャプチャを記憶しています。私はここにVSをインストールしていないので、まだテストすることはできませんが、以下を試してください:

Match match = Regex.Match(subjectString, 
    @"(.*?)  # Match any number of characters and capture them 
    =\{   # Match ={ 
    (   # Match and capture the following group: 
    (?:  # One or more occurences of the following: 
     (?>[^$]+) # One or more characters except $, match possessively and capture 
     \$?  # Match the delimiting $ (optionally, because it's not there after the last item) 
    )+   # End of repeating group 
    )   # End of capturing group 
    \}   # Match } 
    ", 
    RegexOptions.IgnorePatternWhitespace); 
Console.WriteLine("Matched text: {0}", match.Value); 
Console.WriteLine("Word1 = \"{0}\"", match.Groups[1].Value); 
Console.WriteLine("Word2 = \"{0}\"", match.Groups[2].Value);  
captureCtr = 0; 
foreach (Capture capture in match.Groups[3].Captures) { 
    Console.WriteLine("  Capture {0}: {1}", 
          captureCtr, capture.Value); 
    captureCtr++; 
} 
+0

うーん。私は分割とトリムだけで解決策を追加することを考えましたが、私はそれが非常にエレガントになるとは思わない。 – Kobi

1

最初の分割のための正規表現は、次のとおり ^([^ =] +)= {(*)} $

それはcontaints: - ライン の開始 - 任意の文字の最初のグループを除き=(WORD1) - 文字= { - 文字列の残り(WORD2) - 文字} - ラインの終わり

次に、文字$で区切られた部分にWORD2を分割し、適用することができます類似の正規表現(各部分に{と}は付きません)

0

この正規表現は、しかし、私は、文字列あなたドンに多くの情報を前提とそこにあなたの道のほとんどを得る(そして、あなたがnamed capture groups

@"(?<criteria>[^=]+)\=\{((?<params>[^$]+)(\$|}))+" 

を使用して興味のあるものを手に入れるようになります実際には心配していないので、それを完全に取り除いてそこから文字列を解析する方が良いでしょう。あなたは(あなたが今までに戻って、それに変更を加える必要がある場合)を達成しようとしている正確に何について非常に明確になり、これらの線に沿って

何か:

var temp = "CriteriaCondition={FieldName=**{**EPS**}**$MinValue=(-201)$MaxValue=(304)$TradingPeriod=(-1)}"; 

var startToken = "={"; 
var paramString = temp.Substring(temp.IndexOf(startToken) + startToken.Length); 
var cleanParamString = Regex.Replace(paramString, @"[*{}()]", ""); 

var parameters = cleanParamString.Split('$'); 

はあなたとの文字列配列を与えるだろう次の行

FieldName=EPS 
MinValue=-201 
MaxValue=304 
TradingPeriod=-1 

あなたはあなたがそこからずっと簡単に操作できます。

関連する問題