我遇到了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
得到最后一个子串到整个字符串的末尾。
我真的不知道下一步该做什么:(
我错过了什么/做错了什么?
答案 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
至于你目前正在做什么,我认为我们需要看到更多你的代码来弄清楚出了什么问题。你可能在某种循环中有这三行代码来尝试获取每个“子串”。
我的猜测是,在第二次复飞中,您分别在12
和25
获得start
和end
(对于您使用的示例字符串) )。 string.Substring
方法采用起始索引和长度,而不是开始和结束。如果您只是将12
和25
插入该方法,您将获得意想不到的结果:
&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();;