为什么我的.NET正则表达式无法正常工作?

时间:2011-08-30 20:09:20

标签: c# .net regex

我有一个格式为

的文本文件
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时,有时会出现某些键/值对,并且它似乎是在行尾有逗号的那些 - 但我应该考虑到这一点,?。我在这里缺少什么?

3 个答案:

答案 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 选项。