c # извлекает значения из пар ключ-значение в строке - PullRequest
12 голосов
/ 12 января 2010

У меня есть такая строка:

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

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

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

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

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

Ответы [ 7 ]

32 голосов
/ 12 января 2010

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

15 голосов
/ 12 января 2010

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

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

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

3 голосов
/ 12 января 2010

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

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

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

2 голосов
/ 12 января 2010

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

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]);
}
2 голосов
/ 12 января 2010

Вы можете использовать метод разделения

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
1 голос
/ 12 января 2010

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

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

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

0 голосов
/ 12 января 2010

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

...