正则表达式帮助,解析为 NameValueCollection
Regex Help, Parse into NameValueCollection
我遇到了 RegEx
的问题。我收到一个需要解析为 NameValueCollection
的字符串。 ParseQueryString 不起作用,因为 (1) 字符串是 space 分隔的,并且 (2) 值可以包含 space。我无法控制输入。
示例字符串:
-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055
可以包含 space 或连字符的字符串值用单引号引起来。整数值不包含在引号中。
我试过:
[\w\-]+=[\w\s\']+(?![\w\-]+=[\w\s\'\-])
但这不允许在值中使用连字符
[\w\-]+=[\w\s\'\-]+(?![\w\-]+=[\w\s\'\-])
确实如此,但它超出了 space 字符。
理想的输出是:
-AppCode MyApplication
-AppVers V-2016.0 Debug
-MachUuid 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName ABEZG-F05507
-Language 2055
可惜这么多年了我还是想不通RegEx
。如有任何帮助,我们将不胜感激!
您可以使用以下正则表达式:
(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))
([\w-]+)
捕获到名为 "name" 的组中的单词和连字符。 (?:'(?<value>[^']*)'|(?<value>\S+))
将匹配非空格 (\S+
) 的单引号值 ('[^']*'
),但只会将非空格或内容放入名称为 "value" 的组中在 '...'
中不包括引号本身。
样本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
的问题。我收到一个需要解析为 NameValueCollection
的字符串。 ParseQueryString 不起作用,因为 (1) 字符串是 space 分隔的,并且 (2) 值可以包含 space。我无法控制输入。
示例字符串:
-AppCode='MyApplication' -AppVers='V-2016.0 Debug' -MachUuid='2C850880-34FD-12F3-A06B-7336B0C4BC55' -MachName='ABEZG-F05507' -Language=2055
可以包含 space 或连字符的字符串值用单引号引起来。整数值不包含在引号中。
我试过:
[\w\-]+=[\w\s\']+(?![\w\-]+=[\w\s\'\-])
但这不允许在值中使用连字符
[\w\-]+=[\w\s\'\-]+(?![\w\-]+=[\w\s\'\-])
确实如此,但它超出了 space 字符。
理想的输出是:
-AppCode MyApplication
-AppVers V-2016.0 Debug
-MachUuid 2C850880-34FD-12F3-A06B-7336B0C4BC55
-MachName ABEZG-F05507
-Language 2055
可惜这么多年了我还是想不通RegEx
。如有任何帮助,我们将不胜感激!
您可以使用以下正则表达式:
(?<name>[\w-]+)=(?:'(?<value>[^']*)'|(?<value>\S+))
([\w-]+)
捕获到名为 "name" 的组中的单词和连字符。 (?:'(?<value>[^']*)'|(?<value>\S+))
将匹配非空格 (\S+
) 的单引号值 ('[^']*'
),但只会将非空格或内容放入名称为 "value" 的组中在 '...'
中不包括引号本身。
样本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