为了账号安全,请及时绑定邮箱和手机立即绑定

使用数字和千位分隔符修复格式错误的字符串

使用数字和千位分隔符修复格式错误的字符串

C#
繁花如伊 2022-06-19 09:57:30
我收到一个字符串,其中包含与数字中的字符相同的数字、空值和分隔符。也有包含逗号的数字引号。使用 C#,我想解析字符串,这样我就有了一个很好的、管道分隔的数字系列,没有逗号,2 个小数位。我尝试了标准替换,删除了某些字符串模式来清理它,但我不能满足所有情况。我首先删除了引号,但是当千位分隔符变成分隔符时,我得到了额外的数字。我尝试使用Regex.Replace通配符,但由于引号中有多个带有引号和逗号的数字,因此无法从中得到任何东西。为 Silvermind 编辑: temp = Regex.Replace(temp, "(?:\" , .*\")","($1 = . \n)");我无法控制收到的文件。我可以清理大部分数据。当字符串如下所示时,就会出现问题:703.36,751.36,"1,788.36",887.37,891.37,"1,850.37",843.37,"1,549,797.36",818.36,749.36,705.36,0.00,"18,979.70",934.37我应该寻找引号字符,找到下一个引号字符,从这两个字符之间的所有内容中删除逗号,然后继续吗?这是我要去的地方,但那里必须有更优雅的东西(是的 - 我不经常用 C# 编程 - 我是一名 DBA)。我希望看到删除了千位分隔符,并且没有引号。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

此正则表达式模式将匹配字符串中的所有单个数字:

(".*?")|(\d+(.\d+)?)

  • (".*?")匹配之类的东西 "123.45"

  • (\d+(.\d+)?)匹配诸如123.45或之类的东西123

从那里,您可以对每个匹配项进行简单的搜索和替换,以获得“干净”的数字。

完整代码:

  var s = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";


  Regex r = new Regex("(\".*?\")|(\\d+(.\\d+)?)");


  List<double> results = new List<double>();

  foreach (Match m in r.Matches(s))

  {

    string cleanNumber = m.Value.Replace("\"", "");

    results.Add(double.Parse(cleanNumber));

  }


  Console.WriteLine(string.Join(", ", results));

输出:


703.36, 751.36, 1788.36, 887.37, 891.37, 1850.37, 843.37, 1549797.36, 818.36, 749.36, 705.36, 0, 18979.7, 934.37


查看完整回答
反对 回复 2022-06-19
?
温温酱

TA贡献1752条经验 获得超4个赞

使用跟踪状态的解析器类型的解决方案来解决这个问题会更简单。正则表达式适用于常规文本,只要您有上下文,就很难用正则表达式解决。像这样的东西会起作用。


internal class Program

{

    private static string testString = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";





    private static void Main(string[] args)

    {

        bool inQuote = false;

        List<string> numbersStr = new List<string>();


        int StartPos = 0;

        StringBuilder SB = new StringBuilder();

        for(int x = 0; x < testString.Length; x++)

        {

            if(testString[x] == '"')

            {

                inQuote = !inQuote;

                continue;

            }


            if(testString[x] == ',' && !inQuote )

            {

                numbersStr.Add(SB.ToString());

                SB.Clear();

                continue; 

            }


            if(char.IsDigit(testString[x]) || testString[x] == '.')

            {

                SB.Append(testString[x]);

            }

        }

        if(SB.Length != 0)

        {

            numbersStr.Add(SB.ToString());

        }


        var nums = numbersStr.Select(x => double.Parse(x));


        foreach(var num in nums)

        {

            Console.WriteLine(num);

        }


        Console.ReadLine();

    }

}


查看完整回答
反对 回复 2022-06-19
  • 2 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号