2017-10-23 18 views
8

Tôi có một mô hình cụ thể với các định dạng sauCách tách một số khỏi một mẫu cụ thể trong C#?

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

Sử dụng mã này tôi nhận được kết quả sau

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

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

Tôi muốn chia số từ $(). tức là kết quả mong đợi

[2.1,3.2,23.2] 

Làm cách nào để đạt được điều này?

+0

nếu bạn yêu cầu số trong dấu ngoặc trích xuất thì lý do bạn chọn hoa giấy ng 0.5 (như là một số của nó) là bởi vì bạn đã được cụ thể – BugFinder

+0

Phương trình trên chỉ là một ví dụ. Phương trình của tôi chứa định dạng $ (x.x). Và tôi chỉ muốn x.x .. Tôi không phải là chuyên gia trong regex –

+0

Bạn muốn chia tách điều gì? Chỉ nhận được tất cả các kết quả phù hợp với một cái gì đó như '\ ([(\ d.] +) \)' (Ví dụ: số trận đấu trong dấu ngoặc đơn sẽ ghi số). – Richard

Trả lời

9

Tôi đề nghị chiết Matches thay vì Split:

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

Kết quả:

2.1; 3.2; 23.2 
+0

Bạn thật tuyệt vời .... Cảm ơn bạn rất nhiều @Dmitry Bychenko :) –

1

Tương tự như câu trả lời Dmitry nhưng thay vì sử dụng một nhóm phụ sử dụng có chiều rộng không nhìn về phía sau:

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); 
} 
Các vấn đề liên quan