【问题标题】:Regex Help, Parse into NameValueCollection正则表达式帮助,解析成 NameValueCollection
【发布时间】:2016-03-04 07:49:26
【问题描述】:

我遇到了RegEx 的问题。我收到一个需要解析为NameValueCollection 的字符串。 ParseQueryString 不起作用,因为 (1) 字符串是空格分隔的,并且 (2) 值可以包含空格。我无法控制输入。

示例字符串:

-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055

可以包含空格或连字符的字符串值用单引号括起来。整数值不包含在引号中。

我试过了:

  • [\w\-]+=[\w\s\']+(?![\w\-]+=[\w\s\'\-])

但这不允许在值中使用连字符

  • [\w\-]+=[\w\s\'\-]+(?![\w\-]+=[\w\s\'\-])

确实如此,但它超出了空格字符。

理想的输出是:

-AppCode MyApplication
-AppVers V-2016.0 Debug
-MachUuid 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName ABEZG-F05507
-Language 2055

不幸的是,这么多年过去了,我仍然无法弄清楚RegEx。任何帮助将不胜感激!

【问题讨论】:

    标签: .net regex string parsing namevaluecollection


    【解决方案1】:

    您可以使用以下正则表达式:

    (?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))
    

    regex demo

    ([\w-]+) 将名为“名称”的单词和连字符字符捕获到组中。 (?:'(?&lt;value&gt;[^']*)'|(?&lt;value&gt;\S+)) 将匹配非空格 (\S+) 的单引号值 ('[^']*'),但将仅将非空格或 '...' 中的内容放入名称为“值”的组中,不包括引号自己。

    示例C# demo:

    var str = "-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055";
    var matches = Regex.Matches(str, @"(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))")
        .Cast<Match>()
        .ToDictionary(p => p.Groups["name"].Value, p=> p.Groups["value"].Value );
    foreach (var p in matches) {
        Console.WriteLine(p.Key + ": " + p.Value);
    }
    

    输出:

    -AppCode: MyApplication
    -AppVers: V-2016.0 Debug
    -MachUuid: 2C850880-34FD-12F3-A06B-7336B0C4BC55
    -MachName: ABEZG-F05507
    -Language: 2055
    

    【讨论】:

    • 惊人的回答速度!谢谢!另一件事,我没有意识到 RegEx 有一种特定的.Net“风格”。我不得不修改你对 ([\w-]+)=(?:'([^']*)'|(\S+)) 的答案,以便它在.Net中工作。下次我会在问题中说明这一点。
    • 这不是问题:在 .NET 中使用命名的捕获组。我会修改答案。
    • 我完全重新设计了 .NET 的答案。很高兴它对你有效。如果我的回答对您有帮助,也请考虑投票(请参阅How to upvote on Stack Overflow?)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多