正则表达式:去除所有非数字或句点

119
我需要过滤文本中的 "joe ($3,004.50)",并将其转换为 3004.50。我不擅长正则表达式,并且找不到合适的解决方案。只有数字和句点应该保留 - 其他所有内容都应该被过滤掉。我使用 C# 和 VS.net 2008 框架 3.5。
5个回答

211
这应该就可以了。
string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");

2
joe.smith ($3,004.50) 怎么办?简单地删除有问题的字符类可能会出现很大的错误。 - Matthew Gunn
2
我做了一个小修正:Regex.Replace(s, "[^$0-9.]", ""); 你想保留美元符号。 - bodacydo

42

正则表达式是:

[^0-9.]
你可以缓存正则表达式:
Regex not_num_period = new Regex("[^0-9.]")

然后使用:

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

不过,你应该记住,有些文化在书写货币金额时有不同的约定,例如:3.004,50。


4

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

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

似乎上面的正则表达式有多余的括号。使用 (?:^|[^w.,])(\d[\d,.]+)(?=\W|$) 也会匹配字符串 "joe.smith25 ($3,004.50)" 中的 "h25"。 - Rivka

1

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

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

我认为最好匹配一个特定的模式,并使用组提取它。一些简单的内容可以使用正则表达式找到所有连续的逗号、数字和句点:

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

这个正则表达式匹配所有内容。 - mindriot
现在它匹配除了 "" 以外的所有内容。 - mindriot
1
你提出的概念需要一个复杂的正则表达式,难以阅读和调试。最好将其分解为几个正则表达式和条件语句的步骤。我可以提供一个答案(虽然是用Ruby编写的,因为我不知道c#)。 - mindriot
@mindriot 收到。我把它改成了更透明的东西。 - Matthew Gunn
你所说的“send to parser”,是指使用Single.Parse()或者Single.TryParse()吗? - mindriot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接