2010-06-16 133 views
64

我需要像「joe($ 3,004.50)」這樣的文本過濾到3004.50,但在正則表達式中很糟糕,找不到合適的解決方案。所以只有數字和時段應該保留 - 所有其他過濾。我使用C#和VS.net 2008年框架3.5正則表達式刪除所有(非數字或期)

回答

124

這應做到:

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

不知道你能做到這一點,謝謝! – VoodooChild 2010-06-16 17:41:14

+0

非常感謝:) – 2010-06-16 18:27:58

+0

'joe.smith($ 3,004.50)'?簡單地刪除冒犯的字符類可能會非常錯誤。 – 2015-12-03 09:23:49

26

的正則表達式是:

[^0-9.] 

可以緩存正則表達式:

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

然後使用:

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

然而,您應該記住,一些文化在編寫貨幣金額時有不同的慣例,例如:3.004,50。

+0

懶得ATM進行驗證,但並不需要轉義的。 ? – 2010-06-16 17:38:20

+6

@Andrew:不,在一個字符類中,'.'沒有特別的意義。 – 2010-06-16 17:38:58

0

移除違規字符的方法可能是有問題的。如果字符串中有另一個.會怎麼樣?它不會被刪除,但它應該!

刪除非數字或句點,字符串joe.smith ($3,004.50)將轉換爲不可解析的.3004.50

Imho,最好匹配一個特定的模式,並使用組提取它。簡單的東西是要找到所有連續逗號,數字,並用正則表達式的時期:

[\d,\.]+ 

樣品試運行:

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" 

然後每場比賽,刪除所有逗號和發送到解析器。要處理類似12.323.344的情況,您可以進行另一次檢查,看看匹配的子字符串最多隻有一個.

+0

這個正則表達式匹配所有內容。 – mindriot 2015-12-04 04:33:04

+0

@mindriot固定,第一個\ d應該是+ – 2015-12-04 04:42:25

+0

現在它匹配除'「」之外的所有內容。 – mindriot 2015-12-04 04:47:43

2

對於接受的答案,MatthewGunn提出了一個有效的觀點,因爲整個字符串中的所有數字,逗號和句點都會凝聚在一起。這將避免:

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

你正在處理一個字符串 - 字符串是一個IEumerable<char>,所以你可以使用LINQ:

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

Console.WriteLine(result); // 3004.50 
相關問題