ファイル内の文字列のすべての出現を見つけ、その間のテキストをトリミングしてから、何らかの処理を行う必要がある 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));
}