C#正则表达式提取键值

Dis*_*ame 3 c# regex

有没有一种简单而优雅的方法可以从以下格式的字符串中提取键值对?

"key1='value1' key2='value 2' key3='value3' key4='value4' key5='5555' key6='xxx666'"
Run Code Online (Sandbox Code Playgroud)

我的尝试导致了这一点,但我对此不太满意

var regex = new Regex(@"\'\s", RegexOptions.None);
var someString = @"key1='value1' key2='value 2' key3='value3' key4='value4' key5='5555' key6='xxx666'" + " ";

var splitArray = regex.Split(someString);

IDictionary<string, string> keyValuePairs = new Dictionary<string, string>();

foreach (var split in splitArray)
{
    regex = new Regex(@"\=\'", RegexOptions.None);

    var keyValuArray = regex.Split(split);

    if (keyValuArray.Length > 1)
    {
        keyValuePairs.Add(keyValuArray[0], keyValuArray[1]);
    }

}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

您应该可以在不拆分的情况下执行此操作,MatchCollection而是使用 a :

var rx = new Regex("([^=\\s]+)='([^']*)'");
var str = "key1='value1' key2='value 2' key3='value3' key4='value4' key5='5555' key6='xxx666'";
foreach (Match m in rx.Matches(str)) {
    Console.WriteLine("{0} {1}", m.Groups[1], m.Groups[2]);
}
Run Code Online (Sandbox Code Playgroud)

演示。

这个解决方案的核心是这个正则表达式:([^=\\s]+)='([^']*)'它定义了键值对的结构:一个非空格字符序列定义了键,然后是一个等号,后跟用单引号括起来的值。此解决方案按顺序遍历匹配项,提取键和值,Group[1]Group[2]按此顺序分配给匹配组和。