我有一个格式为
的文本文件key1:val1,
key2:val2,
key3:val3
我试图用正则表达式解析键/值对。这是我使用相同示例的正则表达式代码:
string input = @"key1:val1,
key2:val2,
key3:val3";
var r = new Regex(@"^(?<name>\w+):(?<value>\w+),?$", RegexOptions.Multiline | RegexOptions.ExplicitCapture);
foreach (Match m in r.Matches(input))
{
Console.WriteLine(m.Groups["name"].Value);
Console.WriteLine(m.Groups["value"].Value);
}
当我遍历r.Matches
时,有时会出现某些键/值对,并且它似乎是在行尾有逗号的那些 - 但我应该考虑到这一点,?
。我在这里缺少什么?
答案 0 :(得分:5)
这可能是String.Split而不是正则表达式的好情况:
foreach(string pair in input.Split(new Char [] {','}))
{
string [] items = pair.Split(new Char [] {':'});
Console.WriteLine(items[0]);
Console.WriteLine(items[1]);
}
答案 1 :(得分:4)
问题是你的正则表达式与前两行中的换行符不匹配。
尝试将其更改为
@"^(?<name>\w+):(?<value>\w+),?(\n|\r|\r\n)?$"
它应该工作。
顺便说一下,我喜欢正则表达式,但考虑到你要解决的问题,请选择string.Split解决方案。阅读起来会容易得多......
编辑:在阅读你的评论之后,你说这是你问题的简化版本,那么也许你可以通过在末尾为空格/换行添加一些“容差”来简化表达式与
的匹配@"^(?<name>\w+):(?<value>\w+),?\s*$"
此外,当您使用正则表达式时,使用Expresso等工具对其进行测试,可以节省大量时间。
答案 2 :(得分:0)
摆脱 RegexOptions.Multiline 选项。