文字列の「置換」処理
C#で文字列データを扱う際、特定の単語や記号を、別のものに一括で置き換えたいというニーズは頻繁に発生します。例えば、ログレベルの変更(”DEBUG”を”INFO”に)や、古いAPIのエンドポイント名を新しいものに修正する、あるいは単に不要な文字を削除する(空文字列""に置換する)場合などです。
この操作を簡単かつ効率的に行うために、stringクラスにはReplaceメソッドが用意されています。
この記事では、Replaceメソッドの基本的な使い方から、大文字・小文字を区別しない置換方法までを解説します。
string.Replace(string oldValue, string newValue)
Replaceメソッドは、対象の文字列内に含まれるoldValue(置換前の文字列)をすべて検索し、それらをnewValue(置換後の文字列)に置き換えた新しい文字列を返します。
重要な特性:文字列の不変性(Immutable)
C#のstring型は**不変(Immutable)**です。Replaceメソッドは、元の文字列(originalText)を直接変更しません。
Replaceを実行すると、置換が完了した新しい文字列インスタンスが戻り値として返されます。したがって、結果を保持するには、新しい変数に代入するか、元の変数に再代入する必要があります。
string originalText = "Status: Active";
originalText.Replace("Active", "Inactive");
// originalText は "Status: Active" のまま変わらない
Console.WriteLine(originalText);
// 正しい方法:戻り値を代入する
string newText = originalText.Replace("Active", "Inactive");
Console.WriteLine(newText); // "Status: Inactive" が出力される
コード例:基本的な置換
Replaceは、見つかったすべてのoldValueを置換します。
using System;
public class ReplaceBasicExample
{
public static void Main()
.WriteLine("--- 基本的な置換 ---");
string logMessage = "Error: File access denied. Error: Code 500.";
string oldPrefix = "Error:";
string newPrefix = "Warning:";
// "Error:" が "Warning:" に置換される
string updatedLog = logMessage.Replace(oldPrefix, newPrefix);
Console.WriteLine($"元のログ: {logMessage}");
Console.WriteLine($"置換後のログ: {updatedLog}"); // 2箇所とも置換される
}
}
出力結果:
--- 基本的な置換 ---
元のログ: Error: File access denied. Error: Code 500.
置換後のログ: Warning: File access denied. Warning: Code 500.
Replaceのデフォルト動作(大文字・小文字の区別)
Replace(string, string)メソッドは、デフォルトで大文字と小文字を厳密に区別します。
using System;
public class ReplaceCaseSensitiveExample
{
public static void Main()
{
Console.WriteLine("\n--- 大文字・小文字の区別 ---");
string reportTitle = "Report: Monthly Sales (FINAL)";
// "final" (小文字) で "FINAL" (大文字) を探しても見つからない
string updatedTitle = reportTitle.Replace("final", "DRAFT");
Console.WriteLine($"元のタイトル: {reportTitle}");
Console.WriteLine($"置換後のタイトル: {updatedTitle}"); // 何も置換されていない
}
}
出力結果:
--- 大文字・小文字の区別 ---
元のタイトル: Report: Monthly Sales (FINAL)
置換後のタイトル: Report: Monthly Sales (FINAL)
応用:大文字・小文字を区別しない置換
.NET Core 2.0 (および .NET 5 以降) では、StringComparison列挙型を指定できるReplaceのオーバーロードが追加されました。これにより、大文字・小文字を区別しない置換が非常に簡単に行えます。
構文: string.Replace(string oldValue, string newValue, StringComparison comparisonType)
StringComparison.OrdinalIgnoreCase を指定するのが、最も高速で標準的な方法です。
コード例:OrdinalIgnoreCase
古いフレームワーク(.NET Framework 4.xなど)ではこのオーバーロードが提供されていないため、Regex.Replaceを使用する必要がありましたが、現在の.NET環境ではReplaceメソッド単体で対応可能です。
using System;
public class ReplaceIgnoreCaseExample
{
public static void Main()
{
Console.WriteLine("\n--- 大文字・小文字を無視した置換 ---");
string reportTitle = "Report: Monthly Sales (FINAL)";
// "final" (小文字) で "FINAL" (大文字) を検索
// 比較ルールに OrdinalIgnoreCase を指定
string updatedTitle = reportTitle.Replace(
"final",
"DRAFT",
StringComparison.OrdinalIgnoreCase
);
Console.WriteLine($"元のタイトル: {reportTitle}");
Console.WriteLine($"置換後のタイトル: {updatedTitle}"); // 置換が成功
}
}
出力結果:
--- 大文字・小文字を無視した置換 ---
元のタイトル: Report: Monthly Sales (FINAL)
置換後のタイトル: Report: Monthly Sales (DRAFT)
まとめ
string.Replaceは、文字列の一部を別の文字列に一括で置き換えるための強力なメソッドです。
Replace(old, new):oldをnewに置換します(大文字・小文字を区別する)。Replace(old, new, StringComparison.OrdinalIgnoreCase):oldをnewに置換します(大文字・小文字を無視する)。(.NET Core 2.0 / .NET 5 以降で推奨)- 不変性(Immutable):
Replaceは元の文字列を変更しません。必ず戻り値を新しい変数に代入するか、元の変数に再代入する必要があります。
