2017-10-23 43 views
8

BenC# 'da belirli bir desenden sayı nasıl bölülür?

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

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

ben $() numarayı bölmek istediğiniz aşağıdaki bir sonuç almak bu kodu kullanarak aşağıdaki biçimde

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

ile belirli bir desene sahiptir. yani beklenen sonuç

olduğunu
[2.1,3.2,23.2] 

Bunu nasıl başarabiliriz?

+0

Eğer parantez içinde rakamlar gerektirirse, getti'nin sebebi budur ng 0.5 (bir sayı olarak), belirli bir – BugFinder

+0

olduğundan, yukarıdaki denklem sadece bir örnektir. Benim denklemimde $ (x.x) formatı var. Ve sadece x.x istiyorum .. Regex uzman değilim –

+0

Neyi bölmek istiyorsun? Sadece tüm eşleşmeleri '\ ([(\ d.] +) \)' (Yani, sayıları yakalayan parantez içindeki eşleşme sayıları) gibi bir şeyle alın. – Richard

cevap

9

Ben Split yerine Matches ayıklanması öneriyorum:

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)); 

Sonuç:

Dmitry cevabı Benzer ancak bunun yerine arkasında bakmak sıfır genişliğini kullanarak bir alt grubu kullanmanın
2.1; 3.2; 23.2 
+0

Harikasınız .... Çok teşekkür ederim @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); 
} 
İlgili konular