2014-11-02 142 views
1

是否有一種簡單而優雅的方式從下面的格式字符串中提取鍵值對?C#正則表達式來提取鍵值

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

} 

回答

2

您應該可以在沒有鑰匙的情況下拆分,使用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]); 
} 

Demo.

這種解決方案的心臟是正則表達式:([^=\\s]+)='([^']*)'它定義了關鍵值對的結構:非空格字符定義的一個序列關鍵字,然後是一個等號,然後是用單引號括起來的值。該解決方案按順序遍歷匹配,按照該順序提取分配給匹配組Group[1]Group[2]的鍵和值。

+0

感謝@dasblinkenlight。這是現貨。正是我在找什麼。這個解釋也有很大的幫助。非常感激。 – 2014-11-02 15:06:30

0

你可以像下面這樣做

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)將尋找這是'後空間並在鑰匙開始之前

1

另一種方式來做到這一點:

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);