是否有一种简单而优雅的方法可以从以下格式的字符串中提取键值对?
"key1='value1' key2='value 2' key3='value3' key4='value4' key5='5555' key6='xxx666'"
我的尝试导致了这个结果,但我对此不太满意
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]);
}
}
最佳答案
你应该能够在没有拆分的情况下做到这一点,而是使用 MatchCollection
:
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]);
}
这个解决方案的核心是这个正则表达式:([^=\\s]+)='([^']*)'
它定义了键值对的结构:一系列非空格字符定义键,然后是等号,后跟用单引号括起来的值。此解决方案按顺序进行匹配,提取键和值,这些键和值按此顺序分配给匹配组 Group[1]
和 Group[2]
。
关于C#正则表达式提取键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26700562/