创建与一组无序值匹配的正则表达式

时间:2017-11-29 21:50:51

标签: regex

我正在尝试使用正则表达式解析以下内容。这些组包含一系列值,并且始终用新行分隔。但是,并非所有值都将始终存在,并且顺序并不总是相同。

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*))

我可以添加一堆|来解释各种可能的排序,但这会造成巨大的混乱,并使表达式几乎无法读取。

1 个答案:

答案 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