子字符串索引和长度必须引用字符串中的位置

Posted

技术标签:

【中文标题】子字符串索引和长度必须引用字符串中的位置【英文标题】:Substring index and length must refer to a location within the string 【发布时间】:2012-06-24 06:47:02 【问题描述】:

我有一个看起来像

的字符串
string url = "www.example.com/aaa/bbb.jpg";

“www.example.com/”的长度固定为 18。我想从这个字符串中获取“aaa/bbb”部分(实际的 url 不是示例也不是 aaa/bbb,长度可能会有所不同)

这就是我所做的:

string newString = url.Substring(18, url.Length - 4);

然后我得到了异常:索引和长度必须引用字符串中的位置。我的代码有什么问题以及如何修复它?提前致谢。

【问题讨论】:

子字符串的参数是 (startIndex, length)。我不确定你从哪里得到你想要的子字符串的 18 和 Length-4。 还需要减去 18 以说明最初的“www.xxx.com/”编辑:我的意思是,12。你的 18 应该是 12 :) 你能用 System.Uri (msdn.microsoft.com/en-us/library/system.uri.aspx) 类代替吗? 为什么不使用lastindexof(".") 我不想把那个 url 放在这里,所以我把 xxx (引用那个 url)代替。 “www.xxxxxx.com/”长度为 18。 【参考方案1】:

Substring中的第二个参数是子串的长度,不是结束索引。

您可能应该包括处理以检查它确实以您期望的方式开始,以您期望的方式结束,并且至少与您期望的一样长。然后,如果不匹配,您可以执行其他操作或抛出有意义的错误。

以下是一些示例代码,用于验证 url 是否包含您的字符串,也对其进行了一些重构,以便更轻松地将前缀/后缀更改为剥离:

var prefix = "www.example.com/";
var suffix = ".jpg";
string url = "www.example.com/aaa/bbb.jpg";

if (url.StartsWith(prefix) && url.EndsWith(suffix) && url.Length >= (prefix.Length + suffix.Length))

    string newString = url.Substring(prefix.Length, url.Length - prefix.Length - suffix.Length);
    Console.WriteLine(newString);

else
    //handle invalid state

【讨论】:

哦,哎呀,我错了。我会解决的。 应该是结束索引。 :P 微软。 我对人类的建议是不要在工作中访问这个特定的网站。 string newString = url.Substring(18, url.Length - 18);【参考方案2】:

你的错误是 Substring 的参数。第一个参数应该是起始索引,第二个应该是起始索引的长度或偏移量。

string newString = url.Substring(18, 7);

如果子字符串的长度可以变化,则需要计算长度。

(url.Length - 18) - 4(或url.Length - 22)方向的东西

最后会是这个样子

string newString = url.Substring(18, url.Length - 22);

【讨论】:

“aaa/bbb”部分的长度不时变化,所以不完全是 7。但感谢您回答我的问题。赞成你的答案:) 22 是正确的,因为你想知道长度,而不是索引【参考方案3】:

这样的事情怎么样:

string url = "http://www.example.com/aaa/bbb.jpg";
Uri uri = new Uri(url);
string path_Query = uri.PathAndQuery;
string extension =  Path.GetExtension(path_Query);

path_Query = path_Query.Replace(extension, string.Empty);// This will remove extension

【讨论】:

很好的解决方案,完全依赖库函数而不是 hacky 字符串索引,这使得它更具可读性和更健壮。【参考方案4】:

你需要找到第一个/的位置,然后计算出你想要的部分:

string url = "www.example.com/aaa/bbb.jpg";
int Idx = url.IndexOf("/");
string yourValue = url.Substring(Idx + 1, url.Length - Idx - 4);

【讨论】:

【参考方案5】:

试试这个:

 int positionOfJPG=url.IndexOf(".jpg");
 string newString = url.Substring(18, url.Length - positionOfJPG);

【讨论】:

【参考方案6】:
string newString = url.Substring(18, (url.LastIndexOf(".") - 18))

【讨论】:

【参考方案7】:

这是另一个建议。如果您可以将 http:// 添加到您的 url 字符串中,则可以这样做

  string path = "http://www.example.com/aaa/bbb.jpg";
  Uri uri = new Uri(path);            
  string expectedString = 
      uri.PathAndQuery.Remove(uri.PathAndQuery.LastIndexOf("."));

【讨论】:

【参考方案8】:

你需要像这样检查你的陈述:

string url = "www.example.com/aaa/bbb.jpg";
string lenght = url.Lenght-4;
if(url.Lenght > 15)//eg 15

 string newString = url.Substring(18, lenght);

【讨论】:

以上是关于子字符串索引和长度必须引用字符串中的位置的主要内容,如果未能解决你的问题,请参考以下文章

索引和长度必须引用该字符串内的位置。 参数名: length

通过引用字符串位置检查数据框列中的子字符串

解决《索引和长度必须引用该字符串内的位置》的错误

索引和长度必须引用该字符串内的位置--ArgumentOutOfRangeException

最长非重复子串(python实现)

如何通过引用传递子字符串?