При разработке консольного приложения, которое должно было обращаться к веб-сервису, нужно было "распарсить" 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);
}
