我需要过滤文本中的 "joe ($3,004.50)",并将其转换为 3004.50。我不擅长正则表达式,并且找不到合适的解决方案。只有数字和句点应该保留 - 其他所有内容都应该被过滤掉。我使用 C# 和 VS.net 2008 框架 3.5。
string s = "joe ($3,004.50)";
s = Regex.Replace(s, "[^0-9.]", "");
正则表达式是:
[^0-9.]
你可以缓存正则表达式:Regex not_num_period = new Regex("[^0-9.]")
然后使用:
string result = not_num_period.Replace("joe ($3,004.50)", "");
不过,你应该记住,有些文化在书写货币金额时有不同的约定,例如:3.004,50。
您正在处理一个字符串 - 字符串是一个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
对于被接受的答案,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删除有问题的字符的方法可能存在潜在问题。如果字符串中还有另一个.
,它不会被删除,尽管应该被删除!
删除非数字或句点后,字符串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
的情况,您可以进行另一个检查,以查看匹配的子字符串最多只有一个.
。""
以外的所有内容。 - mindriotSingle.Parse()
或者Single.TryParse()
吗? - mindriot
joe.smith ($3,004.50)
怎么办?简单地删除有问题的字符类可能会出现很大的错误。 - Matthew GunnRegex.Replace(s, "[^$0-9.]", "");
你想保留美元符号。 - bodacydo