在C#中解析复杂的格式

时间:2017-04-08 05:50:57

标签: c#

我的文本格式需要在C#中解析。每个测试必须一次解析一个。文本文件格式如下:

$ bundle && rm -rf tmp/cache/assets

将是这样的数据类:

 T1 
  {
     data1=3.5
     data2=58%
     data3=FAIL
  }

   T2
   {
      data1=7.5
      data2=78%
      data3=PASS
   }
解析文本文件后,例如,第一个T1将是measure = 3.5,百分比= 58%,testR =“FAIL”。我如何一次解析一个?

2 个答案:

答案 0 :(得分:0)

您是如何尝试解决此问题的?你能发布你的代码吗?从本质上讲,这并不困难,但您需要跟踪输入文件中的位置,并且需要将问题分解为小块。一个好的开始是能够识别一个阅读的开始和结束。看起来{和}似乎可以达到这个目的。

答案 1 :(得分:0)

使用基于Regex的LALR解析器,您可以非常快速有效地完成这项工作:

    string text = @" T1 
       {
          data1=3.5
          data2=58%
          data3=FAIL
       }

        T2
        {
           data1=7.5
           data2=78%
           data3=PASS
        }";
    string regex = "[ \n\r\t]*([^ \n\r\t{]*)[ \n\r\t]*{[ \n\r\t]*data1=([^ \n\r\t]*)[ \n\r\t]*data2=([^ \n\r\t]*)[ \n\r\t]*data3=([^ \n\r\t]*)[ \n\r\t]*}";
    while(System.Text.RegularExpressions.Regex.IsMatch(text, regex)) {
        var match = System.Text.RegularExpressions.Regex.Match(text, regex);
        Console.WriteLine($"Item name {match.Groups[1].Value}");
        Console.WriteLine($"Data1= {match.Groups[2].Value}");
        Console.WriteLine($"Data2= {match.Groups[3].Value}");
        Console.WriteLine($"Data3= {match.Groups[4].Value}");
        text = text.Substring(match.Groups[0].Value.Length);
    }

您将获得以下输出:

Item name T1
Data1= 3.5
Data2= 58%
Data3= FAIL
Item name T2
Data1= 7.5
Data2= 78%
Data3= PASS

您可以在此处查看有关如何使用正则表达式的更多信息: https://regexone.com/references/csharp