正则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