2010-06-16 134 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 
相关问题