C#查找子串时循环无限执行问题求助
问题原因及修复方案
核心问题:字符串不可变性导致Remove未生效
C# 里的string是不可变类型,所有对字符串的修改方法(比如Remove、TrimEnd、ToUpper)都不会直接修改原字符串,而是返回一个新的字符串对象。你的代码调用这些方法后没有把返回值重新赋值给原变量,导致contentOfFile始终是最初读取的完整内容,循环永远在处理同一个起始位置,自然会重复输出首个匹配结果,且无法终止。
其他潜在问题
catalogType.ToUpper():调用后未赋值,变量不会发生任何变化contentOfFile.TrimEnd():未接收返回值,原字符串末尾的空白不会被移除Substring(startPosition, endPosition):Substring的第二个参数是截取长度,不是结束索引,当前写法会导致截取长度错误,甚至抛出索引越界异常
修复后的代码
private void textToFind(string file, string catalogType) { richTextBox1.Clear(); // 修正:接收ToUpper的返回值 catalogType = catalogType.ToUpper(); string contentOfFile = File.ReadAllText(file); // 修正:接收TrimEnd的返回值 contentOfFile = contentOfFile.TrimEnd(); int startPosition, endPosition; while (contentOfFile.Length > 20) { startPosition = contentOfFile.IndexOf("id"); endPosition = contentOfFile.IndexOf("imagePath"); if (startPosition >= 0 && endPosition > startPosition) { int idOffset = 4; int imagePathOffset = 3; int actualStart = startPosition + idOffset; // 修正:计算截取长度 = 结束位置 - 起始位置 int extractLength = (endPosition - imagePathOffset) - actualStart; string dataToExtract = contentOfFile.Substring(actualStart, extractLength); richTextBox1.AppendText(dataToExtract + "\r\n"); // 修正:计算需要移除的范围,接收Remove的返回值 int removeStart = startPosition; // 移除从"id"开始到"imagePath"结束的整个片段 int removeLength = endPosition + "imagePath".Length - startPosition; contentOfFile = contentOfFile.Remove(removeStart, removeLength); } else { richTextBox1.AppendText("fail " + catalogType + "\r\n"); // 修正:接收Remove的返回值 contentOfFile = contentOfFile.Remove(contentOfFile.Length / 2); } } }
关键修复点说明
- 所有字符串修改操作后,必须将返回值重新赋值给原变量(比如
contentOfFile = contentOfFile.Remove(...)),才能让后续循环处理更新后的内容 - 修正
Substring的参数为截取长度,避免索引越界错误 - 重新计算
Remove的起始位置和长度,确保每次处理后移除已匹配的片段,让下一次循环能定位到新的匹配项
内容的提问来源于stack exchange,提问作者skyppye
相关产品推荐
相关产品推荐

