在C中解析复杂的格式#
问题描述:
我有需要在C#中解析的文本格式。每次测试都必须一次解析一个。文本文件的格式如下:在C中解析复杂的格式#
T1
{
data1=3.5
data2=58%
data3=FAIL
}
T2
{
data1=7.5
data2=78%
data3=PASS
}
的数据的类,将是这样的:
Class data
{
double measure;
double percentage;
string testR;
}
解析文本文件,例如后,第一T1将量度= 3.5,百分比= 58%和testR =“FAIL”。我怎样才能一次解析T1?
答
你可以做到这一点相当迅速和有效地与基于正则表达式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
答
您是如何解决这个问题的?你可以发布你的代码吗?从本质上讲,这并不难,但你需要跟踪你在输入文件中的位置,并且你需要将问题分解成小块。一个好的开始将是能够识别一次阅读的开始和结束。它看起来像{和}可能会达到这个目的。
请添加更多的信息,就像你的班级结构,你迄今为止的尝试.. –
give more关于输入文件的信息......很难以这种格式查找数据。 –
因此,有一个文本文件包含格式化文本,如第一个代码片段所示?你从什么解析? – JohnG