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

Man*_*nto 25 .net c# string substring exception

我有一个看起来像的字符串

string url = "www.example.com/aaa/bbb.jpg";
Run Code Online (Sandbox Code Playgroud)

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

所以这就是我做的:

string newString = url.Substring(18, url.Length - 4);
Run Code Online (Sandbox Code Playgroud)

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

Tim*_* S. 47

第二个参数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
Run Code Online (Sandbox Code Playgroud)

  • 它应该是结束索引。:P 微软。 (2认同)

MAV*_*MAV 6

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

string newString = url.Substring(18, 7);
Run Code Online (Sandbox Code Playgroud)

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

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

最后它看起来像这样

string newString = url.Substring(18, url.Length - 22);
Run Code Online (Sandbox Code Playgroud)


Hat*_*oft 6

这样的事情怎么样:

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
Run Code Online (Sandbox Code Playgroud)