у меня есть строка как это:
blablablamorecontentblablabla?name=michel&score=5&age=28&iliedabouttheage=true
похож на регулярную строку запроса да, но я не нахожусь ни в каком веб-контексте
теперь я хочу извлечь значения (после того, как = знак) их ключом, например, каково имя (michel), счет (5), возраст (28) и т.д.
Обычно я анализирую строку, любят, получают положение в строке слова 'имя', затем добавляют 5 к нему (длина 'имени =') и называют это положение, 'запускают' затем поиск &-sign и называют то положение 'концом' и затем добираются, строка между положением запускаются и заканчиваются.
Но должно быть лучшее решение, действительно ли это - regex вещь?
Попробуйте System.Web.HttpUtility.ParseQueryString, проходя во всем после вопросительного знака. Вам потребуется использовать System.Web сборку, но она не должна требовать веб-контекста.
Не совсем, это можно сделать только с помощью функции Split (далее следует псевдокод, нужно добавить связанные проверки)
string[] query = value.Split('?');
foreach (string pairs in query[1].Split('&')
{
string[] values = pairs.split('=');
}
Затем выполнить итерацию над переменной значений и получить то, что вам нужно.
Можно использовать метод сплит
private static void DoIt()
{
string x = "blablablamorecontentblablabla?name=michel&score=5&age=28&iliedabouttheage=true";
string[] arr = x.Split("?".ToCharArray());
if (arr.Length >= 2)
{
string[] arr2 = arr[1].Split("&".ToCharArray());
foreach (string item in arr2)
{
string[] arr3 = item.Split("=".ToCharArray());
Console.WriteLine("key = " + arr3[0] + " value = " + arr3[1]);
}
}
}
Выход:
key = name value = michel
key = score value = 5
key = age value = 28
key = iliedabouttheage value = true
Я, вероятно, пошел по расщеплению маршрута.
string input = "name=michel&score=5&age=28&iliedabouttheage=true";
string[] pairs = input.Split('&');
Dictionary<string,string> results = new Dictionary<string,string>();
foreach (string pair in pairs)
{
string[] paramvalue = pair.Split('=');
results.Add(paramvalue[0],paramvalue[1]);
}
Как вы предложили, я бы порекомендовал Regex, вероятно, узор, как
(?:.)*\?(.*\&.*)*
, я знаю, что есть что-то еще, что можно использовать, чтобы заставить регулярное выражение игнорировать первую часть [добавлена, я думаю], но я не могу думать из этого. Это получит вам KVP, тогда вам придется разделить результат на «&» (string.split ('&'))
Можно сделать сплит на '&', а затем один на '='. Вначале вы бы разобрались с '?'. Или если строка всегда будет "выглядеть" как квестринг, то вы все равно можете относиться к ней как к таковой и попробовать что-то вроде этого класса Класс QueryString, полезный для манипуляций с квестрингами, придатками и т.д.
Если вы хотите создать словарь пар ключ/значение, то вы можете использовать немного LINQ:
Dictionary<string, string> yourDictionary =
yourString.Split('?')[1]
.Split('&')
.Select(x => x.Split('='))
.ToDictionary(y => y[0], y => y[1]);
(Вы можете пропустить часть Split('?')[1]
, если ваша строка содержала только квестринг, а не весь URL)