c# - 子字符串索引和长度必须引用字符串中的某个位置

标签 c# .net string exception substring

我有一个字符串看起来像

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

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

最佳答案

Substring中的第二个参数是子串的长度,而不是结束索引(换句话说,它不是完整字符串的长度)。

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

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

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

关于c# - 子字符串索引和长度必须引用字符串中的某个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11148238/

相关文章:

c# - 在 C# 服务器上管理连接的 android 客户端

c# - 如何循环 SQL 参数列表和 WHERE 子句?或者更有效地获得结果?

c# - 使用 protobuf 序列化 ConcurrentQueue

c# - 合并两个列表和一个字典以创建一个字典

java - 以这种格式从字符串中解析日期 : dd/MM/yyyy [to dd/MM/yyyy]

c# - 为什么从给定的订阅者抛出时从未调用过OnError回调?

c# - 为什么 C# 没有相当于 python 的 doctest 功能?

java - 在 ArrayList<String> 中查找匹配的字符串出现

java - 使用递归比较两个字符串(不区分大小写)

c# - 可滚动区域如何检索正在显示的内容的大小?