3

ファイル内の文字列のすべての出現を見つけ、その間のテキストをトリミングしてから、何らかの処理を行う必要がある C# winforms アプリを作成しています。

テキスト ファイルの形式は次のとおりです。

---- キー文字列 ----

トリミングするテキスト 1

---- キー文字列 ----

トリミングするテキスト 2

---- キー文字列 ----

トリミングするテキスト 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

ご覧のとおり、インデックスの範囲外にあるものは切り取っていませんが、何が問題なのですか?

PS私は解決策をグーグルで検索しましたが、すべての場合の基本的な考え方は「間違ったインデックス」です。私の場合、インデックスは範囲の「内側」です。まあ、少なくとも私はそう思います。どんな助けでも大歓迎です。

編集:

これに似た何かが問題を解決するはずです:

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

2 に答える 2

3

Substring2つのインデックスを取りません。1つのインデックスと1つの長さが必要です。おそらく、あなたが欲しい

indd2 - indd1

2番目のパラメーターとして(そして、その式に1つずつエラーがないかどうかを確認します)。

于 2012-08-18T14:13:02.803 に答える
1

あなたが持っているもので、これはあなたが得ているものです

3211+4557 = 7768

それは文字列の長さよりも大きいです。

これが部分文字列の仕組みです

substring(startindex, length)

文字列の長さは startIndex + length 未満であってはなりません

于 2012-08-18T14:19:42.480 に答える