【问题标题】:c# extract values from key-value pairs in stringc# 从字符串中的键值对中提取值
【发布时间】:2010-01-12 12:59:58
【问题描述】:

我有一个这样的字符串:

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

看起来像一个常规查询字符串,是的,但我不在任何网络环境中

现在我想通过它们的键提取值(在 = 符号之后),例如,名字是什么(米歇尔)、分数(5)、年龄(28)等。

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

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

【问题讨论】:

    标签: c# .net string query-string


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我认为 Eric 建议的 HttpUtility.ParseQueryString 方法是一个更好的通用解决方案,但如果您需要 Dictionary&lt;K,V&gt; 而不是 NameValueCollection ,那么这将解决问题。
      • 这个 Linq 命令太棒了!在 Windows Phone 中,您无权访问 ParseQueryString,此代码也是如此,谢谢!
      【解决方案3】:

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

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

      然后遍历 values 变量并得到你需要的东西。

      【讨论】:

      • 对于我相信的给定示例,这将返回:values = {"name", "michel&score", "5&age", "28&iliedabouttheage", "true"}
      • 该死,我已经用完了我今年的“正确”! ;)
      【解决方案4】:

      你可以使用拆分方法

      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 class useful for querystring manipulation, appendage, etc

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-01-04
              • 1970-01-01
              • 1970-01-01
              • 2016-06-24
              • 2016-12-08
              • 2017-10-24
              • 2014-04-17
              相关资源
              最近更新 更多