为什么我的.net正则表达式不能正常工作

本文关键字:工作 常工作 我的 net 正则表达式 不能 为什么 | 更新日期: 2023-09-27 18:06:59

我有一个文本文件,格式为:

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时,有时某些键/值对不会出现,并且似乎是在行末尾有逗号的那些-但我应该考虑到,?。我遗漏了什么?

为什么我的.net正则表达式不能正常工作

这可能是String的好情况。分割而不是正则表达式:

foreach(string pair in input.Split(new Char [] {','}))
{
   string [] items = pair.Split(new Char [] {':'});
   Console.WriteLine(items[0]);
   Console.WriteLine(items[1]);
}

问题是你的正则表达式不匹配前两行的换行符。

试试改成

@"^(?<name>'w+):(?<value>'w+),?('n|'r|'r'n)?$"

,它应该工作。
顺便说一下,我喜欢正则表达式,但是考虑到你要解决的问题,还是用字符串吧。分离的解决方案。这将更容易阅读…

编辑:在阅读您的评论后,您说这是您问题的简化版本,那么也许您可以通过在与

匹配的末尾添加一些空格/换行符的"容忍度"来简化表达式。
@"^(?<name>'w+):(?<value>'w+),?'s*$"

另外,当你使用正则表达式时,用Expresso这样的工具来测试它们,这会节省很多时间。

去掉RegexOptions。多行选项。