c#从字符串中的键值对中提取值

时间:2010-01-12 12:59:59

标签: c# .net string query-string

我有一个这样的字符串:

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

看起来像常规查询字符串是,但我不在任何网络上下文

现在我想通过键提取值(在=符号后面),例如,名称(michel),分数(5),年龄(28)等。

通常我解析字符串就像获取单词'name'的字符串中的位置,然后将5添加到它(长度'name =')并将此位置命名为'start'然后搜索& -sign并将该位置命名为“end”,然后在位置start和end之间获取字符串。

但必须有一个更好的解决方案,这是一个正则表达式吗?

7 个答案:

答案 0 :(得分:32)

尝试System.Web.HttpUtility.ParseQueryString,传递问号后的所有内容。您需要使用System.Web程序集,但它不需要Web上下文。

答案 1 :(得分:15)

如果你想创建一个键/值对的字典,那么你可以使用一点LINQ:

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

(如果您的字符串只包含查询字符串而不是整个网址,则可以跳过Split('?')[1]部分。)

答案 2 :(得分:3)

不是真的,这可以通过Split函数来完成(以下是有点伪代码,你需要添加绑定检查)

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

然后迭代值变量并获得所需的东西。

答案 3 :(得分:2)

您可以使用拆分方法

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

答案 4 :(得分:2)

我可能会走斯普利特路线。

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

答案 5 :(得分:1)

正如你的建议,我会推荐正则表达式,可能是像

这样的模式
(?:.)*\?(.*\&.*)*

我知道还有其他东西可以用来让正则表达式忽略第一部分[我想补充],但我想不到它。这会让你获得一个kvp,然后你必须将结果拆分为“&amp;” (String.Split( '&安培;'))

答案 6 :(得分:0)

你可以分开'&amp;'然后一个'='。你必须处理'?'在开始。或者如果字符串总是“看起来”像一个查询字符串,那么你仍然可以像这样对待它并尝试类似这样的类QueryString class useful for querystring manipulation, appendage, etc