2010-06-16 25 views
64

Tôi cần cho văn bản như "joe ($ 3,004.50)" để được lọc xuống 3004.50 nhưng khủng khiếp tại regex và không thể tìm thấy một giải pháp phù hợp. Vì vậy, chỉ có các số và dấu chấm nên ở lại - mọi thứ khác được lọc. Tôi sử dụng C# và VS.net 2008 framework 3.5Regex để loại bỏ tất cả (không phải số OR thời gian)

Trả lời

124

này nên làm điều đó:

string s = "joe ($3,004.50)"; 
s = Regex.Replace(s, "[^0-9.]", ""); 
+0

Không biết bạn có thể làm điều này, cảm ơn! – VoodooChild

+0

cảm ơn thực sự :) –

+0

Điều gì về 'joe.smith ($ 3,004.50)'? Đơn giản chỉ cần loại bỏ các lớp nhân vật vi phạm có thể đi khá sai. –

26

Các regex là:

[^0-9.] 

Bạn có thể cache regex:

Regex not_num_period = new Regex("[^0-9.]") 

sau đó sử dụng:

string result = not_num_period.Replace("joe ($3,004.50)", ""); 

Tuy nhiên, bạn nên nhớ rằng một số nền văn hóa có các quy ước khác nhau để viết số tiền, chẳng hạn như: 3.004,50.

+0

Quá lười biếng ATM để xác minh, nhưng bạn không cần phải thoát khỏi các . ? –

+6

@Andrew: không, bên trong một lớp nhân vật, '.' không có ý nghĩa đặc biệt. –

0

Phương pháp loại bỏ các nhân vật vi phạm là có khả năng có vấn đề. Điều gì sẽ xảy ra nếu có một số . khác trong chuỗi? Nó sẽ không được gỡ bỏ, mặc dù nó nên!

Xóa không có chữ số hoặc dấu chấm, chuỗi joe.smith ($3,004.50) sẽ chuyển thành số không thể khai báo .3004.50.

Imho, tốt hơn là nên khớp một mẫu cụ thể và trích xuất bằng cách sử dụng nhóm. Một cái gì đó đơn giản có thể tìm thấy tất cả tiếp giáp dấu phẩy, chữ số, và thời gian với regexp:

[\d,\.]+ 

mẫu chạy thử nghiệm:

Pattern understood as: 
[\d,\.]+ 
Enter string to check if matches pattern 
> a2.3 fjdfadfj34 34j3424 2,300 adsfa  
Group 0 match: "2.3" 
Group 0 match: "34" 
Group 0 match: "34" 
Group 0 match: "3424" 
Group 0 match: "2,300" 

Sau đó cho mỗi trận đấu, loại bỏ tất cả dấu phẩy và gửi đó để phân tích cú pháp. Để xử lý trường hợp giống như 12.323.344, bạn có thể thực hiện một kiểm tra khác để xem chuỗi con phù hợp có tối đa một số . hay không.

+0

Regex này phù hợp với mọi thứ. – mindriot

+0

@mindriot cố định, đầu tiên \ d phải là một + –

+0

Nó bây giờ phù hợp với tất cả mọi thứ ngoại trừ '" "'. – mindriot

2

Đối với câu trả lời được chấp nhận, MatthewGunn tăng điểm hợp lệ ở tất cả các chữ số, dấu phẩy và dấu chấm trong toàn bộ chuỗi sẽ được cô đặc lại với nhau. Điều này sẽ tránh rằng:

string s = "joe.smith ($3,004.50)"; 
Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)"); 
Match m = r.match(s); 
string v = null; 
if (m.Success) { 
    v = m.Groups[1].Value; 
    v = Regex.Replace(v, ",", ""); 
} 
0

Bạn đang đối phó với một chuỗi - chuỗi là một IEumerable<char>, vì vậy bạn có thể sử dụng LINQ:

var input = "joe ($3,004.50)"; 
var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.')); 

Console.WriteLine(result); // 3004.50 
Các vấn đề liên quan