2014-11-02 3 views
1

Есть ли простой и изящный способ извлечь пары значений из строки ниже формата?C# regex для извлечения значения ключа

"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. Это место. Именно то, что я искал. Объяснение также помогает. Очень признателен. –

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); 
Смежные вопросы