2016-03-04 41 views
2

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

例字符串:可以包含空格或连字符

-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\'\-])

这种做法,但它超出了Spac e字符。

理想的输出将是:

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

遗憾的是这些年后,我仍然无法弄清楚RegEx。任何帮助,将不胜感激!

回答

2

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

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

regex demo

([\w-]+)捕捉到一个名为 “名” 字和连字符组。 (?:'(?<value>[^']*)'|(?<value>\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 
+0

惊人的响应速度!谢谢!另一件事,我没有意识到RegEx有一个特定的.Net“味道”。我必须修改你的答案([\ w - ] +)=(?:'([^'] *)'|(\ S +))才能在.Net中工作。下次我会在这个问题中说清楚。 – Greg

+0

这不是一个问题:在.NET中使用*命名捕获组*。我会修改答案。 –

+0

我完全重新解决了.NET的问题。很高兴它对你有效。如果我的回答对你有帮助,请考虑upvoting(参见[如何在堆栈溢出?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)) 。 –