如何用IndexOf与Substring提取alt值并解决去除alt=前缀时的异常?
提取alt属性值的正确实现
需求:从字符串 alt="hello world" >" 中提取出 hello world,使用IndexOf和Substring方法实现。
原代码问题分析
- 第一段代码:
int indexDescription = line.IndexOf("alt="); int indexDescriptionEnd = line.IndexOf("\" >"); string descriptionResult = line.Substring(indexDescription, indexDescriptionEnd - indexDescription);
结果包含alt=前缀,因为Substring的起始位置是alt=的索引,直接截取到" >的起始位置,自然包含了前面的alt="部分。
- 第二段修改后的代码:
string descriptionResult = line.Substring(indexDescription + 6, indexDescriptionEnd - indexDescription);
触发ArgumentOutOfRangeException,原因是Substring的第二个参数是截取长度而非结束索引。修改起始位置后,长度仍用原结束索引减原起始索引,导致长度超出字符串有效范围。
正确实现方案
方案一:精准定位引号位置
直接定位alt=前后的引号,更能适配格式变动:
// 找到"alt="的起始索引 int indexAlt = line.IndexOf("alt="); if (indexAlt == -1) { // 处理找不到alt=的情况 string descriptionResult = string.Empty; return; } // 找到alt=之后的第一个双引号(值的起始引号) int startQuote = line.IndexOf('"', indexAlt + "alt=".Length); if (startQuote == -1) { string descriptionResult = string.Empty; return; } // 找到起始引号之后的第一个双引号(值的结束引号) int endQuote = line.IndexOf('"', startQuote + 1); if (endQuote == -1) { string descriptionResult = string.Empty; return; } // 截取两个引号之间的内容 string descriptionResult = line.Substring(startQuote + 1, endQuote - startQuote - 1);
方案二:基于原代码修正长度计算
如果坚持用" >"作为结束标识,修正Substring的长度参数即可:
int indexDescription = line.IndexOf("alt="); int indexDescriptionEnd = line.IndexOf("\" >"); if (indexDescription == -1 || indexDescriptionEnd == -1 || indexDescription + 5 >= indexDescriptionEnd) { string descriptionResult = string.Empty; return; } // 起始位置跳过"alt=\"(共5个字符),长度为结束位置减去新的起始位置 string descriptionResult = line.Substring(indexDescription + 5, indexDescriptionEnd - (indexDescription + 5));
关键说明
Substring(startIndex, length)的第二个参数是从startIndex开始要截取的字符数,不是结束索引。- 必须增加边界判断(比如找不到目标子串的情况),避免空指针或越界异常。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

