如何让IndexOf()方法返回正确的值?
本文关键字:返回 方法 IndexOf | 更新日期: 2023-09-27 18:10:47
我一直在与googlemaps工作,我现在正在寻找格式坐标。
我得到以下格式的坐标:
地址(坐标)zoomlevel .
我使用indexof方法来获取"("+1的起始值,以便我获得坐标的第一个数字,并将该值存储在我称为"start"的变量中。
然后我做同样的事情,但这次我得到的索引是")"-2获取最后一个坐标的最后一个数字,并将该值存储在我称为"end"的变量中。
我得到以下错误:"索引和长度必须指向字符串中的位置。参数名称:长度
我得到以下字符串作为非参数:
"Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5"
根据我的计算,我应该在开始变量中得到36,在结束变量
中得到65但是由于某些原因我得到的值是41在start和71在end
为什么?
public string RemoveParantheses(string coord)
{
int start = coord.IndexOf("(")+1;
int end = coord.IndexOf(")")-2;
string formated = coord.Substring(start,end);
return formated;
}
然后尝试硬编码正确的值
string Test = cord.Substring(36,65);
然后得到以下错误:
startindex不能大于字符串长度。参数名称startindex
我理解这两个错误的意思,但在这种情况下,他们是不正确的,因为我没有超出字符串长度值。
谢谢!
Substring
的第二个参数是长度(MSDN源)。由于您将65
传递给第二个参数,因此您的调用试图获取36
和101 (36+65)
之间的字符。您的字符串中没有101个字符,因此会抛出错误。要获取(
字符之间的数据,使用以下命令:
public string RemoveParantheses(string coord)
{
int start = coord.IndexOf("(")+1;
int end = coord.IndexOf(")")-2;
string formated = coord.Substring(start, end - start);
return formated;
}
编辑:它只与坐标一起工作的原因是因为总字符串的长度更短,并且由于坐标从第一个位置开始,因此结束坐标是最后一个位置。例如…
//using "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5"
int start = coord.IndexOf("(") + 1; // 36
int end = coord.IndexOf(")")-2; // 65
coord.Substring(start, end); //looks at characters 35 through 101
//using (61.9593214318303,14.0585965625)5
int start = coord.IndexOf("(") + 1; // 1
int end = coord.IndexOf(")")-2; // 30
coord.Substring(start, end); //looks at characters 1 through 31
第二个实例是有效的,因为31实际上存在于您的字符串中。一旦您将地址添加到字符串的开头,您的代码将不再工作。
提取字符串的部分是正则表达式的一个很好的用途:
var match = Regex.Match(locationString, @"'((?<lat>['d'.]+),(?<long>['d'.]+)')");
string latitude = match.Groups["lat"].Value;
string longitude = match.Groups["long"].Value;
您可能忘记计算换行符和其他空格,'r'n换行符是2个"不可见"字符。另一个错误是,您正在调用Substring与(Start, End),而它的(Start, Count)或(Start, End - Start)
根据我的计算,我应该在开始变量中得到36,在结束变量
中得到65
那么你的计算是错误的。对于上面的字符串,我还看到(并且LinqPad确认)打开父括号位于位置42,关闭父括号位于索引73。
使用Substring
时得到的错误是因为Substring
的参数是开始位置和长度,而不是结束位置,所以您应该使用:
string formated = coord.Substring(start,(end-start+1));
Substring()的重载接受两个参数,起始索引和长度。当您真正想要获得希望修剪的字符串的长度时,您已经提供了第二个值作为)
出现次数的索引,在这种情况下,您可以从(
的索引中减去)
的索引。例如:-
string foo = "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5";
int start = foo.IndexOf("(") + 1;
int end = foo.IndexOf(")");
Console.Write(foo.Substring(start, end - start));
Console.Read();
或者,您可以使用正则表达式解析字符串,例如:-
Match r = Regex.Match(foo, @"'(([^)]*)')");
Console.Write(r.Groups[1].Value);
可能会比前面的例子
string input =
"Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5";
var groups = Regex.Match(input,
@"'((['d'.]+),(['d'.]+)')('d{1,2})").Groups;
var lat = groups[1].Value;
var lon = groups[2].Value;
var zoom = groups[3].Value;