正则expression式删除所有(非数字或期限)

我需要像“joe($ 3,004.50)”这样的文本过滤到3004.50,但在正则expression式中很糟糕,找不到合适的解决scheme。 所以只有数字和时期应该留下来 – 其他所有的过滤。 我使用C#和VS.net 2008框架3.5

这应该做到这一点:

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

正则expression式是:

 [^0-9.] 

你可以caching正则expression式:

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

然后使用:

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

但是,您应该记住,一些文化在编写货币金额方面有不同的惯例,例如:3.004,50。

对于接受的答案,MatthewGunn提出了一个有效的观点,即整个string中的所有数字,逗号和句点都会被凝聚在一起。 这将避免:

 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, ",", ""); } 

删除冒犯angular色的方法是潜在的问题。 如果有另一个呢. 在string的地方? 它不会被删除,但它应该!

删除非数字或句点,stringjoe.smith ($3,004.50)将转换为不可parsing的.3004.50

Imho,最好匹配一个特定的模式,并使用一个组来提取它。 一件简单的事情就是用正则expression式find所有连续的逗号,数字和句点:

 [\d,\.]+ 

样品testing运行:

 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" 

然后,对于每个匹配,删除所有逗号,并将其发送到parsing器。 为了处理类似12.323.344 ,你可以做另一个检查来查看一个匹配的子串最多只有一个.

你正在处理一个string – string是一个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