string.indexof无法按预期工作

时间:2014-02-02 14:09:20

标签: c# regex substring

我遇到了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得到最后一个子串到整个字符串的末尾。

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

6 个答案:

答案 0 :(得分:3)

使用为此

设计的类,而不是使用字符串操作
var coll = HttpUtility.ParseQueryString("key=muchdata&key=muchdata&key2=muchdata");
var key = coll["key"];

答案 1 :(得分:1)

您可以使用string.Split获取[&]key=

之间的所有值
var myValues
    = "key=muchdata&key=muchdata&key=muchdata".Split(new[] { "key=", "&key=" },
         StringSplitOptions.None);

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

muchdata
muchdata
muchdata

至于你目前正在做什么,我认为我们需要看到更多你的代码来弄清楚出了什么问题。你可能在某种循环中有这三行代码来尝试获取每个“子串”。

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

&key=muchdata&key=muchdat

答案 2 :(得分:0)

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

中的字符数进行调整

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您可以在Split之前key=发送文字,然后使用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>

答案 5 :(得分:0)

你应该试试这个

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();;