Я сделал это с помощью LINQ ... может быть, это не самый лучший способ, но было интересно узнать это:
string test = "<info:\"Enterprise Optimizer 7.4 for COR Technology 5.5 -- Advanced Solver Edition\", url:\"http://EO.riverlogic.com\", url_menu:\"EO Online...\", app_id:\"EOAS\",app_name:\"Enterprise Optimizer AS\", **app_major:7**, **app_minor:4**,**app_micro:5**,app_copyright:\"251 1996-2010 River Logic Inc.\r\nAll Rights Reserved.\">";
var result = test.Split(',').
Select(p => p.Trim().Split(':')).
Where(i => i[0].Trim().StartsWith("**app_")).
Select(r => new { Key = r[0].Trim('*'), Value = r[1].TrimEnd('*') });
Производит:
result = {{Key = "app_major", Value = "7"},
{Key = "app_minor", Value = "4"},
{Key = "app_micro", Value = "5"}}
Возможно, это даже можно сделать более элегантно:)
РЕДАКТИРОВАТЬ: Если вы хотите сделать очень простой доступ к тому, что вы хотите сделать:
var result = test.Split(',').
Select(p => p.Trim().Split(':')).
Where(i => i[0].Trim().StartsWith("**app_")).
Select(r => new { Key = r[0].Trim('*'), Value = r[1].TrimEnd('*') }).
ToDictionary(k => k.Key, v => v.Value);
Затем, чтобы получить значение, просто дайте ему ключ вот так:
var version = result["app_major"] ?? "Not Found";
Примечание. Я протестировал решение LINQ против решения Regex, и версия LINQ не так уж сильно отличается по скорости, но он немного медленнее, чем опубликованные ответы regex. Ответ regex, однако, не очищает данные для вас и представляет их в удобной форме. Часть ToDictionary
действительно замедляет ее (с точки зрения реального времени, хотя она почти ничего не меняет), но облегчает использование результатов.