我正在尝试使用正则表达式解析以下内容。这些组包含一系列值,并且始终用新行分隔。但是,并非所有值都将始终存在,并且顺序并不总是相同。
abc = 111
def = 122
ijk = 133
def = 222
abc = 211
ijk = 233
abc = 311
ijk = 333
这是我到目前为止所拥有的,但它只有在每个值都存在且顺序正确的情况下才有效
(?:abc = (?<abc>\d*))\n(?:def = (?<def>\d*))\n(?:ijk = (?<ijk>\d*))
我可以添加一堆|
来解释各种可能的排序,但这会造成巨大的混乱,并使表达式几乎无法读取。
答案 0 :(得分:0)
您需要一个以任何顺序匹配单个组的模式,然后使用Regex.Matches
提取每个组:
var pattern = @"(?:(?:(?:abc = (?<abc>\d+))|(?:def = (?<def>\d+))|(?:ijk = (?<ijk>\d+)))\r\n)+";
var ans = Regex.Matches(src, pattern, RegexOptions.Multiline)
.Cast<Match>()
.Select(mg => mg.Groups.Cast<Group>().Skip(1).Select(g => new { g.Name, g.Value }).ToDictionary(g => g.Name, g => g.Value));
我使用LINQ将每个组的捕获量降低到Dictionary
。如果您想要整个组的词典条目(键Skip(1)
),则可以省略0
。