C#正则表达式提取带点和逗号的金额/数值问题求助
C#正则表达式提取带点和逗号的金额/数值问题求助
嗨,我来帮你搞定这个正则提取数值的问题~
我看你需要从三段文本里提取三种格式的金额数值:1.529,11、(231,48)和21.945,51,但当前的正则没能匹配全所有目标值对吧?
问题分析
你原来的正则(?:((\(|[0-9])+[\.|,]))+\d+([\s]|\))逻辑比较零散,没有精准覆盖你要处理的几种数值格式:比如带千分点的正数、被括号包裹的负数形式,而且对重复的千分点(比如1.234.567,89这类格式)也没做适配。
解决方案
我给你写一个更精准的正则,能覆盖你所有的目标场景:
(\(\d+(?:\.\d+)*,\d+\)|(\d+(?:\.\d+)*),\d+)
正则逻辑拆解
(\(\d+(?:\.\d+)*,\d+\)):专门匹配带括号的负数格式(比如(231,48))\(和\):匹配左右括号\d+(?:\.\d+)*:匹配整数部分,支持带多个千分点(比如231或1.234),\d+:匹配小数部分的逗号和数字
|:逻辑或,用来分隔两种不同的数值格式(\d+(?:\.\d+)*),\d+:匹配不带括号的正数格式(比如1.529,11、21.945,51)
C#代码示例
你可以直接用这段代码测试提取效果:
using System; using System.Text.RegularExpressions; class Program { static void Main() { string input = @"Saldo em Tesouraria 1.529,11 100,00% 0,00% Custo SELIC 17/04/23 (231,48) Diferimento de despesa de TAXA CVM com vencimento 29/12/23 21.945,51"; // 用上面的正则表达式 string pattern = @"(\(\d+(?:\.\d+)*,\d+\)|(\d+(?:\.\d+)*),\d+)"; MatchCollection matches = Regex.Matches(input, pattern); // 输出所有匹配到的结果 foreach (Match match in matches) { Console.WriteLine(match.Value); } } }
运行这段代码会输出:
1.529,11 (231,48) 21.945,51
额外小技巧
如果需要把带括号的数值转换成负数形式(比如把(231,48)变成-231,48),可以在匹配后做简单处理:
foreach (Match match in matches) { string value = match.Value; if (value.StartsWith("(") && value.EndsWith(")")) { value = "-" + value.Trim('(', ')'); } Console.WriteLine(value); }
这样输出就会变成:
1.529,11 -231,48 21.945,51
备注:内容来源于stack exchange,提问作者Data Tools
相关产品推荐
相关产品推荐

