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

时间:2018-12-19 21:55:35

标签: c# regex replace

我收到的字符串中包含与数字中的字符相同的数字,空值和定界符。此外,在包含逗号的数字周围也有引号。使用C#,我想解析字符串,这样我得到了一个很好的,用竖线分隔的数字系列,没有逗号,两位小数。

我尝试了标准替换,删除了某些字符串模式以进行清理,但我无法解决所有问题。我先删除了引号,但是随着千位分隔符变成定界符,我得到了更多的数字。我尝试将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 个答案:

答案 0 :(得分:0)

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

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

  • (".*?")"123.45"
  • 之类的东西匹配
  • (\d+(.\d+)?)123.45123之类的东西匹配

从那里,您可以进行简单的搜索并在每次比赛中进行替换,以获取一个“干净的”数字。

完整代码:

  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

答案 1 :(得分:0)

使用跟踪状态的解析器类型的解决方案更容易解决。正则表达式用于常规文本,只要您有上下文,就很难用正则表达式解决。这样的事情会起作用。

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();
    }
}