文字列の部分的な削除
C#で文字列を処理していると、「ログからタイムスタンプの部分だけを削除したい」や、「”Data:” というプレフィックス(接頭辞)を取り除きたい」など、文字列の特定の部分だけを削除して、残りの部分を取得したい場合があります。
stringクラスは、このような操作のために Remove メソッドを提供しています。
この記事では、Remove メソッドの2つの主要な使い方と、使用する上での重要な注意点について解説します。
Remove(int startIndex, int count):指定位置から指定文字数を削除
最も一般的に使用される形式が、startIndex(開始インデックス)とcount(削除する文字数)を指定する方法です。
インデックスは 0(ゼロ)から始まります。
Remove(startIndex, count) のコード例
ファイル名 "[Processed]-Report-2025.csv" から、不要なプレフィックス "[Processed]-"(12文字)を削除する例です。
using System;
public class RemoveCountExample
{
public static void Main()
{
string originalFileName = "[Processed]-Report-2025.csv";
int startIndex = 0; // 先頭から
int count = 12; // 12文字を削除
// インデックス 0 から 12 文字を削除
string cleanedFileName = originalFileName.Remove(startIndex, count);
Console.WriteLine($"元のファイル名: {originalFileName}");
Console.WriteLine($"削除後のファイル名: {cleanedFileName}");
}
}
出力結果:
元のファイル名: [Processed]-Report-2025.csv
削除後のファイル名: Report-2025.csv
Remove(int startIndex):指定位置から最後までを削除
Remove メソッドのもう一つの形式は、startIndex(開始インデックス)のみを指定する方法です。この場合、指定されたインデックスから文字列の末尾までがすべて削除されます。
Remove(startIndex) のコード例
IndexOf メソッドと組み合わせて、特定の区切り文字(例: ;)以降のコメント部分をすべて削除する例です。
using System;
public class RemoveToEndExample
{
public static void Main()
{
string settingLine = "Server=MainDB_01; UserID=Admin; Pwd=***";
// 最初の ';' の位置を検索
int commentStartIndex = settingLine.IndexOf(';');
// ';' が見つかった場合 (-1 ではない場合)
if (commentStartIndex != -1)
{
// ';' の位置から最後までをすべて削除
string connectionString = settingLine.Remove(commentStartIndex);
Console.WriteLine($"元の文字列: {settingLine}");
Console.WriteLine($"接続文字列のみ: {connectionString}");
}
}
}
出力結果:
元の文字列: Server=MainDB_01; UserID=Admin; Pwd=***
接続文字列のみ: Server=MainDB_01
重要な注意点:文字列の不変性(Immutability)
Remove メソッド(および Substring, Replace などC#の文字列操作メソッドの多く)を使用する際、最も重要な注意点があります。それは、C#の文字列は不変(Immutable)であるということです。
Remove メソッドは、元の文字列を直接変更しません。 代わりに、指定された部分が削除された「新しい文字列」を生成して返します。
失敗する例(元の文字列は変わらない)
string greeting = "Hello, World!";
greeting.Remove(0, 7); // "Hello, " を削除するつもり
// greeting 変数自体は何も変わっていない
Console.WriteLine(greeting); // "Hello, World!" がそのまま出力される
正しい例(新しい変数に結果を代入)
Remove メソッドが返してきた新しい文字列を、別の変数(または元の変数自身)に代入し直す必要があります。
string greeting = "Hello, World!";
string newGreeting = greeting.Remove(0, 7); // 削除された新しい文字列が返される
Console.WriteLine(newGreeting); // "World!" が出力される
// または、元の変数を上書きする
// greeting = greeting.Remove(0, 7);
注意点2: ArgumentOutOfRangeException
Remove メソッドに指定する startIndex や count が文字列の有効な範囲(長さ)を超えている場合、プログラムは ArgumentOutOfRangeException という実行時エラーをスローして停止します。
IndexOf の結果を Remove に渡す際は、IndexOf が -1(見つからなかった)を返していないか、必ずチェック(if (index != -1))する必要があります。
まとめ
string.Remove メソッドは、文字列の特定の部分を削除するための基本的な機能です。
Remove(int startIndex, int count): 指定位置から指定した文字数を削除します。Remove(int startIndex): 指定位置から文字列の最後までを削除します。
C#の文字列は不変(Immutable)であるため、Remove メソッドは元の文字列を変更せず、削除済みの新しい文字列を返すという点を必ず理解しておく必要があります。
