При разработке консольного приложения, которое должно было обращаться к веб-сервису, нужно было "распарсить" GET-запрос пути к изображению. К сожалению, System.Web.HttpClient для консольных приложений недоступен, потому пришлось искать другое решение.
Сначала хотел написать свой метод, но при поиске подходящего регулярного выражения натолкнулся на очень элегантное решение, которе чуть-чуть под себя переделал. По сути я лишь заменил тип входящего параметра для метода.
public static class UriExtensions { private static readonly Regex queryStringRegex; static UriExtensions() { queryStringRegex = new Regex(@"[\?&](?<name>[^&=]+)=(?<value>[^&=]+)"); } public static IEnumerable<KeyValuePair<string, string>> ParseQueryString(this string uri) { if (uri == null) throw new ArgumentException("uri"); var matches = queryStringRegex.Matches(uri); for (int i = 0; i < matches.Count; i++) { var match = matches[i]; yield return new KeyValuePair<string, string>(match.Groups["name"].Value, match.Groups["value"].Value); } } }
Обращение к классу и применение:
string qs = "https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=regex%20parse%20querystring%20values%20to%20named%20groups%20c%23"; var ue = qs.ParseQueryString().ToDictionary(kvp => kvp.Key, kvp => kvp.Value); //Вывод отдельных записей: Console.WriteLine("source: "+ ue["sourceid"]); Console.WriteLine("ie: " + ue["ie"]); //Вывод всех записей: foreach (var ueitem in ue) { Console.WriteLine(ueitem.Key + " : " + ueitem.Value); }