解决异常的“超出范围”错误行为

时间:2012-08-18 14:09:46

标签: c# winforms text find-occurrences

我正在创建C#winforms app,它必须在文件中查找字符串的所有出现,在其间裁剪文本,然后进行一些处理。

文本文件格式如下:

  

---- Key_String ----

     

要裁剪的文字1

     

---- Key_String ----

     

要裁剪的文字2

     

---- Key_String ----

     

要裁剪的文字3

基本上我正在从该文件中裁剪“text1”,“text2”,“text3”。

以下是执行上述操作的代码:

string contents = "";
MatchCollection matches;
using (StreamReader reader = File.OpenText(filepath))
{
    contents = reader.ReadToEnd();
    matches = Regex.Matches(contents, "Key_String");
}
int totalmatchcount = matches.Count;

for (int i = 0; i < totalmatchcount; i++ )
{
    int indd1 = matches[i].Index;
    int indd2 = 0;
    string sub_content = "";
    if (i != totalmatchcount - 1)
    {
        indd2 = matches[i+1].Index;
        try
        {
            sub_content = contents.Substring(indd1, indd2); // error here
        }
        catch
        {
            MessageBox.Show("Index 1: "  + indd1 + "\n" +
                "Index 2: "  + indd2 + "\n" +
                "Max index (length - 1): "  + (contents.Length - 1)
                );
        }
    }
    else { sub_content = contents.Substring(indd1); }
    // do some stuff with "sub_content"
}

它适用于我的某些文件,但在某些情况下 - 我收到以下错误:

  

索引和长度必须指向字符串中的位置。   参数名称:长度

这很奇怪,因为我正在裁剪的子字符串位于主字符串的内部,而不是你所猜到的外部字符串。我可以通过“try-catch”输出证明它:

  

索引1:3211

     

指数2:4557

     

最大指数(长度 - 1):5869

正如你所看到的 - 我没有裁剪位于索引范围之外的东西,那么问题是什么呢?

P.S。我用google搜索解决方案,但在每种情况下的基本想法是 - “错误的索引”。在我的情况下 - 索引是在“范围内”的范围。好吧,至少我是这么认为的。任何帮助将不胜感激。

修改

类似的东西可以解决问题:

 public string SubstringFix(string original, int start, int end)
    {
        int endindex = 0;
        if (end < original.Length)
        {
            endindex = end;
        }
        else
        {
            endindex = original.Length - 1;
        }

        return original.Substring(start, (end - start));
    }

2 个答案:

答案 0 :(得分:3)

Substring没有两个指数。它需要一个索引和一个长度。可能,你想要

indd2 - indd1

作为第二个参数(并检查该表达式是否有一个错误)。

答案 1 :(得分:1)

你拥有的就是你得到的东西

3211+4557 = 7768

并且大于字符串的长度。

这是子串的工作原理

substring(startindex, length)

字符串的长度不应小于startIndex + length