一种不做大量索引匹配并保持单个正则表达式的方法是将捕获组更改为全部具有相同的名称。嵌套捕捉真正得到推到第一,所以你最终得到一个这样的数组堆栈:
["1", "123", "1", "2", "3", "L1 123 1 2 3", "2", "456", "4", "5", "6", "L2 456 4 5 6"]
然后,它只是一个部分LINQ疯狂的事当含有L-捕捉到的结果分成组被找到,然后从每个组中提取数据。
var regex = new Regex(@"^SENT KV(?<singlelinedata> L(?<singlelinedata>[1-9]\d*) (?<singlelinedata>\d+)(?: (?<singlelinedata>\d+))+)+$");
var matches = regex.Matches("SENT KV L1 123 1 2 3 L2 456 4 5 6 12 13 L3 789 7 8 9 10");
var singlelinedata = matches[0].Groups["singlelinedata"];
string groupKey = null;
var result = singlelinedata.Captures.OfType<Capture>()
.Reverse()
.GroupBy(key => groupKey = key.Value.Contains("L") ? key.Value : groupKey, value => value.Value)
.Reverse()
.Select(group => new { key = group.Key, data = group.Skip(1).Reverse().ToList() })
.Select(item => new { line = item.data.First(), measureline = item.data.Skip(1).First(), samplingpoints = item.data.Skip(2).ToList() })
.ToList();
这是个好主意。我认为这就是_Eli Arbel_的意思是“...使用字符索引来自己计算“,但是在他的回答中,我并没有正确理解它,它看起来可以为组编写一个扩展方法,根据您的GetCaptures实现在其他捕获中获取所有捕获。 –