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


92

我需要将“ joe($ 3,004.50)”之类的文本过滤到3004.50,但在正则表达式中却很糟糕,无法找到合适的解决方案。因此,只有数字和句点应该保留-其他所有内容都被过滤掉了。我使用C#和VS.net 2008框架3.5

Answers:


166

应该这样做:

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

1
joe.smith ($3,004.50)呢 简单地删除令人讨厌的字符类可能会出错。
马修·冈恩

2
我做了一个小小的更正:Regex.Replace(s, "[^$0-9.]", "");您想留下美元符号。
bodacydo

35

正则表达式为:

[^0-9.]

您可以缓存正则表达式:

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

然后使用:

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

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


懒惰的ATM无法验证,但是您不需要逃脱。?
Andrew Anderson

7
@Andrew:不,在字符类中,.没有特殊含义。
巴特·基尔斯

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)将转换为unparseable .3004.50

恕我直言,最好匹配特定的模式,然后使用组将其提取。简单的方法是使用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,您可以再次检查以查看匹配的子字符串最多具有一个.


此正则表达式匹配所有内容。
mindriot 2015年

现在它匹配除以外的所有内容""
mindriot 2015年

1
您提出的概念将需要一个复杂的正则表达式,该正则表达式很难阅读和调试。最好使用几个正则表达式和条件将其分解为多个步骤。我可以提供一个答案(尽管用Ruby编写,因为我不懂C#。)
mindriot 2015年

@mindriot点已采取。我将其更改为更透明的内容。
马修·冈恩

通过发送到解析器,您是指Single.Parse()还是Single.TryParse
mindriot

1

您正在处理一个字符串-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.