2017-10-23 6 views
8

私は次のような結果C#で特定のパターンから数値を分割する方法は?

var doubleArray = Regex 
    .Split(str, @"[^0-9\.]+") 
    .Where(c => c != "." && c.Trim() != "") 
    .ToList(); 

//result 
[2.1,3.2,23.2,0.5] 

私は$()から番号を分割したいを取得し、次の形式

このコードを使用して
string exp = "$(2.1)+$(3.2)-tan($(23.2)) * 0.5"; 

で特定のパターンを持っています。すなわち期待される結果は、どのように私はこれを達成することができます

[2.1,3.2,23.2] 

のですか?

+0

括弧内に数字が必要な場合は、あなたがgettiの理由を抽出するあなたが特定したものではないので、0.5(数字として)はありません – BugFinder

+0

上記の式は単なる例に過ぎません。私の方程式には$(x.x)形式が含まれています。そして私はx.xだけを望んでいます。私は正規表現の専門家ではありません –

+0

何を分割したいですか? '\([(\ d。] +)\)'(つまり、番号を捕らえるカッコ内の数字にマッチする)のようなものとすべてのマッチを得るだけです。 – Richard

答えて

9

私はSplitの代わりにMatchesを抽出することをお勧め:

string exp = "$(2.1)+$(3.2)-tan($(23.2)) * 0.5"; 

var doubleArray = Regex 
    .Matches(exp, @"\$\((?<item>[0-9.]+)\)") 
    .OfType<Match>() 
    .Select(match => match.Groups["item"].Value) 
    .ToList(); 

Console.WriteLine(string.Join("; ", doubleArray)); 

結果:

ドミトリーの答えに似ていますが、代わりに、背後に見えるゼロ幅を使用して、サブグループを使用しての
2.1; 3.2; 23.2 
+0

あなたは素晴らしいです....ありがとう@Dmitry Bychenko :) –

1

string str = "$(2.1)+$(3.2)-tan($(23.2)) * 0.5"; 

var doubleArray = 
    Regex 
     .Matches(str, @"(?<=\$\()[0-9\.]+") 
     .Cast<Match>() 
     .Select(m => Convert.ToDouble(m.Value)) 
     .ToList(); 

foreach (var d in doubleArray) 
{ 
    Console.WriteLine(d); 
} 
関連する問題