繁体   English   中英

反序列化包含重复元素集的字符串

[英]Deserialize a string that contains a repeating set of elements

我得到如下响应字符串:

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
         ]

如您所见,“ 名称”,“间隔”,“值”,“计数”正在重复,并且将重复“ n”否。 的时间。 如何通过为此过程创建类型(类)来反序列化它?

假设该班级有点像:

class Navigator
{
 string modifier;
 string score;
 .
 .
 string Name;
 string Interval;
 string Value;
 int Count;
}

我们如何获得Name,Interval,Value,Count的重复值?

提前致谢。

我建议您自由使用正则表达式来提取所需的信息。 这增加了很多复杂性,但是您的另一个选择是令牌化 ,对于给定的输入,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+) 

在名为input的变量中给定输入数据,您将使用以下代码:

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

实时示例: http : //rextester.com/rundotnet?code=OQTZE85773

这说明了如何提取所需的值。 现在使用@Jeremy McGee描述的数据结构,并按照他的描述来读取值。

我认为您正在寻找的是一种将给定的文本字符串转换为某种内部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);
}

(您需要根据扫描文本的方式,找出一种适当的方法来测试是否还有另一个间隔可以读取。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM