Подтвердить что ты не робот

С# извлекать значения из пар ключ-значение в строке

У меня есть строка вроде этого:

blablablamorecontentblablabla?name=michel&score=5&age=28&iliedabouttheage=true

выглядит как строка регулярных запросов да, но я не в каком-либо веб-контексте

теперь я хочу извлечь значения (после знака =) по их ключу, например, что такое имя (michel), оценка (5), возраст (28) и т.д.

Обычно я разбираю строку, как бы получить позицию в строке слова "имя", затем добавьте 5 к ней (длина "name=" ) и назовите эту позицию "start", затем найдите & - подпишите и назовите эту позицию "конец", а затем получите строку между началом и концом позиции.

Но должно быть лучшее решение, является ли это регулярным выражением?

4b9b3361

Ответ 1

Попробуйте System.Web.HttpUtility.ParseQueryString, передавая все после отметки вопроса. Вам нужно будет использовать сборку System.Web, но для этого не требуется веб-контекст.

Ответ 2

Если вы хотите создать словарь пары ключ/значение, вы можете использовать бит LINQ:

Dictionary<string, string> yourDictionary =
    yourString.Split('?')[1]
              .Split('&')
              .Select(x => x.Split('='))
              .ToDictionary(y => y[0], y => y[1]);

(Вы можете пропустить часть Split('?')[1], если ваша строка содержит только строку запроса, а не весь URL-адрес.)

Ответ 3

Не совсем, это можно сделать только с помощью функции Split (что следует за псевдокодом, вам нужно добавить связанные проверки)

string[] query = value.Split('?');
foreach (string pairs in query[1].Split('&')
{
  string[] values = pairs.split('=');
}

Затем перебираем переменную значений и получаем нужные вам вещи.

Ответ 4

Вы можете использовать метод 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

Ответ 5

Я бы, вероятно, пошел по маршруту Сплит.

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]);
}

Ответ 6

Как вы предположили, я бы рекомендовал регулярное выражение, возможно, такой шаблон, как

(?:.)*\?(.*\&.*)*

Я знаю, что есть что-то еще, что может использоваться, чтобы заставить регулярное выражение игнорировать первую часть [добавлено, я думаю], но я не могу думать об этом. Это даст вам kvp, тогда вам придется разделить результат на "&". (String.split( '&'))

Ответ 7

Вы можете сделать разбивку на '&' а затем один на '='. Вам придется иметь дело с '?' в начале. Или, если строка всегда будет выглядеть так, как querystring, тогда вы все равно можете рассматривать ее как таковую и попробовать что-то вроде этого класса класс QueryString, полезный для манипуляции с querystring, добавлением, и т.д.