一種不做大量索引匹配並保持單個正則表達式的方法是將捕獲組更改爲全部具有相同的名稱。嵌套捕捉真正得到推到第一,所以你最終得到一個這樣的數組堆棧:
["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實現在其他捕獲中獲取所有捕獲。 –