【问题标题】:string.indexof not working as expectedstring.indexof 没有按预期工作
【发布时间】:2014-02-02 14:09:20
【问题描述】:

string.IndexOf 方法有问题。
我有一个包含多个要提取的子字符串的字符串。
示例:

key=muchdata&key=muchdata&key=muchdata

这是输入字符串的简化结构。
muchdata 可以包含每个 A-Za-z0-9 和特殊字符,如 !"§$%&/()=?

我想获取所有key= 字符串之间的数据。

首先我想使用一个正则表达式,但我无法创建一个有效的。 然后我考虑使用string.IndexOf.
所以我做了这样的事情:

int start = input.IndexOf("key=");
int end = input.IndexOf("&key=");
string sub = input.Substring(start, end);

不幸的是,这并没有按预期工作。有时它甚至会返回一个子字符串,但长度约为 30 个字符。
我构建了更多代码来检查 end == -1 是否到达末尾,这样我就得到了从 start 到整个字符串末尾的最后一个子字符串。

我真的不知道下一步该做什么:(
我错过了什么/做错了什么?

【问题讨论】:

  • Substring的参数。第二个不是索引,而是计数...

标签: c# regex substring


【解决方案1】:

不要使用字符串操作,而是使用为此设计的类

var coll = HttpUtility.ParseQueryString("key=muchdata&key=muchdata&key2=muchdata");
var key = coll["key"];

【讨论】:

  • 在本例中,变量“key”将具有值“muchdata, muchdata”,并将所有值附加到匹配的键名(因此前两个具有键名“key”)。拥有唯一的键名当然可以解决这个问题。
  • 还必须首先将对 System.Web 的引用添加到项目中,就像“使用 System.Web;”一样。似乎只包含引用的 DLL 中可用的一些代码,而没有类 HttpUtility。
  • hmm...生成的代码有点难看,但你的方法到目前为止效果最好。谢谢:)
【解决方案2】:

您可以使用string.Split 获取[&]key= 之间的所有值

var myValues
    = "key=muchdata&key=muchdata&key=muchdata".Split(new[] { "key=", "&key=" },
         StringSplitOptions.None);

您的字符串的输出将是一个字符串数组:

muchdata
muchdata
muchdata

至于您目前在做什么,我认为我们需要查看您的更多代码以找出问题所在。您可能在某种循环中使用这三行代码来尝试获取每个“子字符串”。

我的猜测是,在第二次复飞时,您将分别在 startend 中获得 1225(对于您使用的示例字符串)。 string.Substring 方法采用起始索引和长度,而不是开始和结束。如果您只是将1225 插入该方法,您会得到意想不到的结果:

&key=muchdata&key=muchdat

【讨论】:

    【解决方案3】:

    你应该这样做 string sub = input.Substring(start + 4, end);因为 start 是 Key= 开始的索引。因此,要获取子字符串,您应该通过 Key=

    中的字符数进行调整

    【讨论】:

      【解决方案4】:

      这是因为IndexOf() 返回搜索表达式的第一个字符的位置。所以你需要添加表达式的长度。此外,Substring 将长度作为第二个参数,而不是结束索引。

      var startEx = "key=";
      int start = input.IndexOf(startEx) + startEx.Length;
      int end = input.IndexOf("&key=");
      string sub = input.Substring(start , end - start);
      

      【讨论】:

        【解决方案5】:

        你可以通过key=Split你的文字,然后用LINQ:删除所有无效字符

        var str = "key=muchdata&key=muchdata&key=muchdata";
        var result = str.Split(new string[] { "key=" }, StringSplitOptions.RemoveEmptyEntries)
                     .Select(word => new String(word.Where(char.IsLetterOrDigit).ToArray()))
                     .ToList();
        

        结果应该是List<string>

        【讨论】:

          【解决方案6】:

          你应该试试这个

          string input="key=muchdata1&key=muchdata2&keys=muchdata3";
          var data=input.Split(new[] { "&" }, StringSplitOptions.None);
          List<String> keyValues = new List<String>();
          foreach(string d in data)
          {
              if(d.StartsWith("key="))
              {
                  keyValues.Add(d.Substring(4));
              }
          }
          //Access Values Here
          foreach (string d in keyValues)
          {
              Console.WriteLine(d);
          }
          Console.ReadKey();;
          

          【讨论】:

            猜你喜欢
            • 2021-10-19
            • 2020-03-18
            • 2012-06-14
            • 2014-11-15
            • 1970-01-01
            • 2012-07-02
            • 2011-09-07
            • 2013-03-03
            • 2015-05-18
            相关资源
            最近更新 更多