2

我有一个问题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。任何帮助,将不胜感激!

4

1 回答 1

3

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

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

查看正则表达式演示

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

示例C# 演示

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
于 2016-03-04T07:52:24.570 回答