正则表达式删除所有(非数字OR期间)

时间:2010-06-16 17:35:19

标签: c# regex

我需要将像“joe($ 3,004.50)”这样的文字过滤到3004.50,但在正则表达式上很糟糕,找不到合适的解决方案。所以只有数字和句号应该保留 - 其他一切都被过滤掉我使用C#和VS.net 2008 framework 3.5

5 个答案:

答案 0 :(得分:153)

这应该这样做:

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

答案 1 :(得分:31)

正则表达式是:

[^0-9.]

您可以缓存正则表达式:

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

然后使用:

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

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

答案 2 :(得分: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, ",", "");
}

答案 3 :(得分:1)

您正在处理字符串 - 字符串是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

答案 4 :(得分:0)

删除违规字符的方法可能存在问题。如果字符串中有另一个.,该怎么办?它不会被删除,尽管它应该被删除!

删除非数字或句点,字符串joe.smith ($3,004.50)将转换为不可解析的.3004.50

Imho,最好匹配特定模式,并使用组提取它。简单的方法是用regexp查找所有连续的逗号,数字和句点:

[\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之类的情况,您可以再次检查以查看匹配的子字符串最多只有一个.