C#正则表达式提取键值

本文关键字:键值 提取 正则表达式 | 更新日期: 2023-09-27 18:28:57

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

"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]);
    }
}

C#正则表达式提取键值

您应该能够在不进行拆分的情况下执行此操作,而是使用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]的键和值。

另一种方法:

var someString = @"key1='value1' key2='value 2' key3='value3' key4='value4' key5='5555' key6='xxx666'" + " ";
Dictionary<string, string> dic = Regex.Matches(someString, @"(?<key>'w+)='(?<value>[^']*)'")
                                      .OfType<Match>()
                                      .ToDictionary(m => m.Groups["key"].Value, m => m.Groups["value"].Value);

你可以这样做

var str = "key1='value1' key2='value 2' key3='value3' key4='value4' key5='5555' key6='xxx666'";
var arr = Regex.Split(str, "(?<=')''s(?=''w)"); // split on whitespace to get key=value
foreach(var s in arr) {
    var nArr = s.Split("="); // split on = to get key and value
    keyValuePairs.Add(nArr[0], nArr[1]);
}

(?<=')'s(?='w)将查找'之后和密钥开始之前的空间