2011-09-17 19 views
1

私はこのような文字列(私のreadline)得た:C#で部分文字列の後に残りの文字列を切り取る方法は?

アルファ:10662ベータ:-64ガマ:70679デルタ:1001

私はパラメータとしてこの数字の一部を使用する必要があるのが、これらの数字はさまざまな長さを持つことができます。ベータとアルファの値が変わることができれば

str1 = readline.Substring(6, 5); 

しかし、どのように私は、ガンマの値になるだろう:私は私が行うことができます値のアルファを抽出することを想像できますか?

+0

正規表現を使用して値を一致として抽出することをお勧めします。 –

答えて

4

すべてname:valueペアと一致し、名前と値を抽出するために、キャプチャグループを使用するように正規表現を使用することができます。

var readline = "alpha: 10662 beta: -64 gamma: 70679 delta: 1001"; 
var matches = Regex.Matches(readline, @"(?<parameter>\w*):\s*(?<value>-?\d*)"); 
var dictionary = new Dictionary<string,int>(); 
foreach (Match m in matches) 
{ 
    dictionary.Add(m.Groups["parameter"].Value,int.Parse(m.Groups["value"].Value)); 
} 
Console.WriteLine(dictionary["gamma"]); // output: 70679 
+0

+1私のものと比較して優れた正規表現のスキルを持っています。 –

+0

私はあなたが必要とする正確な値を抽出するためにキャプチャグループが必要であると確信しています。 – ChaosPandion

+0

キャプチャグループを正規表現に追加しました。 –

2

私はそれを部分文字列を使用していることを別の方法をやって行くだろう。まず、セパレータを分割して、偶数の位置のキーと奇数の位置の値を持つキー/値の配列を生成します。次に、必要なキーに関連付けられている値を2秒間並べて配列を反復するか、常に同じ順序であれば、変換する正しい配列要素を選択するだけです。

妥当な入力がないことを確認するために、必要に応じて入力の検証を適用します。

var parameters = line.Split(new [] { ':', ' ' }, StringSplitOptions.RemoveEmptyEntries); 

for (var i = 0; i < parameters.Length; i += 2) 
{ 
    var key = parameters[i]; 
    var value = int.Parse(parameters[i+1]); 

    // do something with the value based on the key 
} 
+0

これは、コロンで分割することは、正規表現に比べて興味深いアプローチです。 – JohnD

2

これは、正規表現のために良いフィットのように思える:私はこのためにSUBSTRINGを使用することはありません

var regex = new Regex(@"(\w+)\:\s(-?\d+)"); 
var values = from pair in regex.Matches("alfa: 10662 beta: -64 gama: 70679 delta: 1001").OfType<Match>() 
      select new { Key = pair.Groups[1].Value, pair.Groups[2].Value }; 
0

。より冗長でエラーが発生しやすくなります。

これは簡単ですが、すべてのデータが空白で区切られているように見えます。これは公正な仮定ですか?各変数の順序は常に同じですか?もしそうなら、あなたは単に空白で分割して、他のすべての数字をつかむことができます。

データが常に同じ形式でない場合は、代わりに正規表現を使用します。

/alfa: ([+-]\d+)/ 

"alpha:"と記号の後の数字をキャプチャするものは次のとおりです。あなたは浮動小数点値のために少し好きなものが必要です。正直なところ、私は非常には正規表現を使用することはめったにありません。私は普通の正規表現を書くときはいつも正規表現のバディを使用していますので、私はあまりにも長い時間がかかります=)

編集:参照してください、マークの正規表現は私のよりもはるかに優れています。

関連する問題