C# 反序列化包含重复元素集的字符串
我得到的响应字符串如下所示:C# 反序列化包含重复元素集的字符串,c#,asp.net,C#,Asp.net,我得到的响应字符串如下所示: Navigator[sizenavigator:INTEGER (Size) modifier:size score:1.300855517 type:INTEGER unit:kB hits:7744 hitsUsed:7744 ratio:1 min:65 max:66780 mean:3778
Navigator[sizenavigator:INTEGER (Size)
modifier:size
score:1.300855517 type:INTEGER unit:kB
hits:7744
hitsUsed:7744
ratio:1
min:65
max:66780
mean:3778
sum: 29259942
frequencyError:-1
entropy:1.300855533
points:
Name:Less than 1
Interval: ->1023
Value:[;1023]
Count:1121
Name:Between 1 and 2
Interval: 1024->2047
Value:[1024;2047]
Count:3325
Name:Between 2 and 3
Interval: 2048->3071
Value:[2048;3071]
Count:1558
Name:More than 3
Interval: 3072->
Value:[3072;]
Count:1740
]
var modifierRegex = new Regex(@"modifier:(.*[^\r\n])");
var scoreRegex = new Regex(@"score:(.*[^\n\r])");
var itemsRegex = new Regex(@"Name:\s*(?<name>.*[^\r\n])\s*\r\n\s+Interval:\s(?<interval>\d*\-\>\d*)\s*\r\n\s+Value:\s*(?<value>\[\d*;\d*\])\s*\r\n\s+Count:\s*(?<count>\d+)");
var modifierMatch = modifierRegex.Match(input);
var scoreMatch = scoreRegex.Match(input);
var itemsMatches = itemsRegex.Matches(input);
var modifier = modifierMatch.Groups[1].Value;
var score = scoreMatch.Groups[1].Value;
foreach(Match match in itemsMatches)
{
var name = match.Groups["name"].Value;
var interval = match.Groups["interval"].Value;
var value = match.Groups["value"].Value;
var count = match.Groups["count"].Value;
}
如您所见,名称、间隔、值、计数正在重复,这将重复“n”次。如何通过为此进程创建类型(类)来反序列化它
如果类有点像:
class Navigator
{
string modifier;
string score;
.
.
string Name;
string Interval;
string Value;
int Count;
}
如何获得名称、间隔、值、计数的重复值
提前感谢。我想您正在寻找的是一种将给定的文本字符串转换为某种内部C#数据结构的方法。对于重复结构,您需要两个类:一个用于文本的“主体”,另一个用于重复项:
class Navigator
{
string modifier;
string score;
.
.
List<IntervalItem> Intervals;
}
class IntervalItem
{
string Name;
string Interval;
string Value;
int Count;
}
类导航器
{
字符串修饰符;
弦乐;
.
.
列出时间间隔;
}
类间隔
{
字符串名;
串间隔;
字符串值;
整数计数;
}
然后在反序列化文本的代码中,类似于:
Navigator navigator = new Navigator();
// ... populate the modifier, score, and suchlike
navigator.Intervals = new List<IntervalItem>();
while ( // something to test if we have an interval to read // )
{
IntervalItem intervalItem = new IntervalItem();
// ... populate the interval from the name, interval, value
navigator.Intervals.Add(intervalItem);
}
Navigator=newnavigator();
// ... 填充修改器、分数等
navigator.interval=新列表();
while(//如果我们要读取间隔,则需要测试一些内容//)
{
IntervalItem IntervalItem=新IntervalItem();
//…从名称、间隔、值填充间隔
navigator.interval.Add(intervalItem);
}
(你需要找到一种合适的方法来测试你是否有另一个时间间隔可以根据你扫描文本的方式来阅读。)我认为你正在寻找的是一种将给定的文本字符串转换为某种内部C#数据结构的方法。对于重复结构,您需要两个类:一个用于文本的“主体”,另一个用于重复项:
class Navigator
{
string modifier;
string score;
.
.
List<IntervalItem> Intervals;
}
class IntervalItem
{
string Name;
string Interval;
string Value;
int Count;
}
类导航器
{
字符串修饰符;
弦乐;
.
.
列出时间间隔;
}
类间隔
{
字符串名;
串间隔;
字符串值;
整数计数;
}
然后在反序列化文本的代码中,类似于:
Navigator navigator = new Navigator();
// ... populate the modifier, score, and suchlike
navigator.Intervals = new List<IntervalItem>();
while ( // something to test if we have an interval to read // )
{
IntervalItem intervalItem = new IntervalItem();
// ... populate the interval from the name, interval, value
navigator.Intervals.Add(intervalItem);
}
Navigator=newnavigator();
// ... 填充修改器、分数等
navigator.interval=新列表();
while(//如果我们要读取间隔,则需要测试一些内容//)
{
IntervalItem IntervalItem=新IntervalItem();
//…从名称、间隔、值填充间隔
navigator.interval.Add(intervalItem);
}
(你需要找到一种合适的方法来测试你是否有另一个阅读间隔,这取决于你是如何浏览文本的。)我建议你自由地使用正则表达式来提取你需要的信息。这增加了很多复杂性,但您的另一个选择是,在给定输入的情况下,哪个IMO将同样复杂地实现 修饰符的正则表达式非常简单。它要求您查找文本字符串“修饰符:”并捕获
:
之后的内容,直到行的末尾-由cr lf\r\n
标记。您可以利用捕获组来获取所需信息,因此正则表达式是:
modifier:(.*[^\r\n])
score的正则表达式也很简单,查找文本字符串score:
,并捕获:
之后的所有内容,直到行尾:
score:(.*[^\n\r])
重复项的正则表达式要复杂得多,并且再次利用捕获组(这次命名是为了更容易提取它们)来获取您感兴趣的信息。这是测试和工作:
Name:\s*(?<name>.*[^\r\n])\s*\r\n\s+Interval:\s(?<interval>\d*\-\>\d*)\s*\r\n\s+Value:\s*(?<value>\[\d*;\d*\])\s*\r\n\s+Count:\s*(?<count>\d+)
实例:
这将向您展示如何提取所需的值。现在使用一个数据结构,例如,并按照他描述的方式读取值。我建议您自由地使用正则表达式来提取所需的信息。这增加了很多复杂性,但您的另一个选择是,在给定输入的情况下,哪个IMO将同样复杂地实现 修饰符的正则表达式非常简单。它要求您查找文本字符串“修饰符:”并捕获
:
之后的内容,直到行的末尾-由cr lf\r\n
标记。您可以利用捕获组来获取所需信息,因此正则表达式是:
modifier:(.*[^\r\n])
score的正则表达式也很简单,查找文本字符串score:
,并捕获:
之后的所有内容,直到行尾:
score:(.*[^\n\r])
重复项的正则表达式要复杂得多,并且再次利用捕获组(这次命名是为了更容易提取它们)来获取您感兴趣的信息。这是测试和工作:
Name:\s*(?<name>.*[^\r\n])\s*\r\n\s+Interval:\s(?<interval>\d*\-\>\d*)\s*\r\n\s+Value:\s*(?<value>\[\d*;\d*\])\s*\r\n\s+Count:\s*(?<count>\d+)
实例:
这将向您展示如何提取所需的值。现在使用数据结构,例如,并按照他所描述的方式读取值。这是如何序列化的?这是一种非常奇怪的格式。你不能把它改成更结构化的东西,比如XML或JSON吗?这样做的另一个好处是,您可以使用现有的反序列化程序。+1用于现有的反序列化程序:手动运行您自己的反序列化程序并不有趣。这是我从一个Microsoft FAST Search服务器得到的响应。我无法更改它。如果这是对一个已知系统的响应,那么一定有一种已知的反序列化方法…不?这是如何序列化的?这是一种非常奇怪的格式。你不能把它改成更结构化的东西,比如XML或JSON吗?这样做的另一个好处是,您可以使用现有的反序列化程序。+1用于现有的反序列化程序:手动运行您自己的反序列化程序并不有趣。这是我从一个Microsoft FAST Search服务器得到的响应。我不能改变它。如果这是对一个知名系统的响应,那么一定有一个知名的方法来反序列化它…不?那真的很酷。。让我试试这个。。非常感谢。。!!很好的一个-添加了我答案中缺失的部分。哦,还有+1这个/great/regex tester:作为一个不喜欢regex的人,它看起来像是一个极好的资源。@jeremy-我实际上是用它来编写/测试regex的,这是一个帮助编写regex的好工具。@Jamiec:如果我想忽略换行符?实际上字符串是