C#のReplaceで文字列を置換する方法|使い方・改行・複数置換・効かない原因まで解説

はじめに

C#で文字列の一部を別の文字列に変えたいときによく使うのがReplaceメソッドです。たとえば、文章内の「旧」を「新」に置き換える、改行を削除する、半角スペースを取り除く、ファイルパスの区切り文字を変更する、といった処理で使います。

csharp replaceC# Replaceで調べる人の多くは、基本的な使い方だけでなく、「改行が置換できない」「複数の文字列をまとめて置換したい」「大文字・小文字を区別せずに置換したい」「Replaceが効かない原因を知りたい」といった実践的な悩みを持っています。

この記事では、C#のReplaceの基本構文から、改行・空白・特殊文字の置換、複数置換、大文字小文字を無視した置換、置換されない原因、Regex.Replaceとの使い分けまで詳しく解説します。

1. C#のReplaceとは?文字列を置換する基本メソッド

1-1. Replaceメソッドでできること

C#のReplaceは、文字列内にある指定した文字や文字列を、別の文字や文字列に置き換えるためのメソッドです。

たとえば、次のように使います。

C#
string text = "今日は雨です";
string result = text.Replace("雨", "晴れ");

Console.WriteLine(result);

実行結果は次の通りです。

C#
今日は晴れです

Replaceには、主に次のような用途があります。

C#
// 文字列を置換する
text.Replace("old", "new");

// 1文字を置換する
text.Replace('a', 'b');

// 不要な文字列を削除する
text.Replace("不要", "");

// 大文字・小文字を考慮して置換する
text.Replace("abc", "xyz", StringComparison.OrdinalIgnoreCase);

Microsoftのドキュメントでも、String.Replaceは「現在の文字列内の指定した文字または文字列を、別の文字または文字列に置換した新しい文字列を返す」メソッドとして説明されています。Microsoft Learn

1-2. Replaceは元の文字列を直接変更せず、新しい文字列を返す

C#のstringはイミュータブル、つまり作成後に中身を変更できない型です。そのため、Replaceを呼び出しても元の文字列そのものは変更されません。置換後の結果は、新しい文字列として返されます。C#の文字列は不変であり、変更しているように見える操作も実際には新しい文字列を返す仕様です。Microsoft Learn

次のコードを見てください。

C#
string text = "apple banana apple";

text.Replace("apple", "orange");

Console.WriteLine(text);

一見するとappleorangeに置換されそうですが、実行結果は次の通りです。

C#
apple banana apple

Replaceの戻り値を受け取っていないため、置換結果が捨てられています。正しくは次のように書きます。

C#
string text = "apple banana apple";

text = text.Replace("apple", "orange");

Console.WriteLine(text);

実行結果は次の通りです。

C#
orange banana orange

C#のReplaceが効かないと感じる原因の多くは、この「戻り値を代入していない」パターンです。

1-3. Replaceの基本構文と引数

よく使うReplaceの基本構文は次の通りです。

C#
string result = 元の文字列.Replace(置換前の文字列, 置換後の文字列);

例を見てみましょう。

C#
string text = "C#は楽しい。C#は便利。";
string result = text.Replace("C#", "CSharp");

Console.WriteLine(result);

実行結果は次の通りです。

C#
CSharpは楽しい。CSharpは便利。

引数の意味は次の通りです。

C#
text.Replace("C#", "CSharp");

"C#"が置換対象、"CSharp"が置換後の文字列です。文字列内に同じ置換対象が複数ある場合、基本的にはすべて置換されます。

1文字だけを置換する場合は、charを使ったオーバーロードも利用できます。

C#
string text = "a-b-c";
string result = text.Replace('-', '/');

Console.WriteLine(result);

実行結果は次の通りです。

C#
a/b/c

1-4. Replaceで置換対象が見つからない場合の動作

置換対象の文字列が見つからない場合、Replaceはエラーにはならず、元の内容と同じ文字列を返します。

C#
string text = "apple banana";
string result = text.Replace("orange", "grape");

Console.WriteLine(result);

実行結果は次の通りです。

C#
apple banana

この仕様は便利ですが、「Replaceしたのに変わらない」と感じる原因にもなります。置換対象が完全一致しているか、空白・改行・大文字小文字・全角半角の違いがないかを確認することが重要です。

2. C#のReplaceの基本的な使い方

2-1. 指定した文字列を別の文字列に置換する

最も基本的な使い方は、指定した文字列を別の文字列に置き換える方法です。

C#
string message = "Hello, World!";
string result = message.Replace("World", "C#");

Console.WriteLine(result);

実行結果は次の通りです。

C#
Hello, C#!

日本語の文字列でも同じように使えます。

C#
string text = "東京都に住んでいます";
string result = text.Replace("東京都", "大阪府");

Console.WriteLine(result);

実行結果は次の通りです。

C#
大阪府に住んでいます

Replaceは単純な文字列置換に向いています。決まった文字列を決まった文字列に置き換えるだけなら、正規表現を使うよりもReplaceの方が読みやすくなります。

2-2. 1文字だけを置換する

1文字だけを置換したい場合は、シングルクォーテーションでcharを指定します。

C#
string code = "2026-06-14";
string result = code.Replace('-', '/');

Console.WriteLine(result);

実行結果は次の通りです。

C#
2026/06/14

charを使う場合は、置換前と置換後の両方を1文字で指定します。

C#
string text = "a,b,c";
string result = text.Replace(',', '|');

Console.WriteLine(result);

実行結果は次の通りです。

C#
a|b|c

1文字の置換であれば、Replace("a", "b")のように文字列で指定することもできますが、意図が明確な場合はReplace('a', 'b')の方がシンプルです。

2-3. 文字列を空文字に置換して削除する

Replaceでは、置換後の文字列に空文字""を指定することで、対象の文字列を削除できます。

C#
string text = "電話番号: 090-1234-5678";
string result = text.Replace("-", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
電話番号: 09012345678

不要な文字を削除したい場合にもよく使います。

C#
string text = "  C# Replace  ";
string result = text.Replace(" ", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C#Replace

ただし、前後の空白だけを削除したい場合はReplaceではなくTrimを使う方が適切です。

C#
string text = "  C# Replace  ";
string result = text.Trim();

Console.WriteLine(result);

実行結果は次の通りです。

C#
C# Replace

2-4. Replaceの戻り値を変数に代入する書き方

Replaceは戻り値を使うことが前提です。次のように、別の変数に代入するか、元の変数に再代入します。

C#
string text = "red blue red";

string result = text.Replace("red", "green");

Console.WriteLine(result);

元の変数を更新したい場合は次のように書きます。

C#
string text = "red blue red";

text = text.Replace("red", "green");

Console.WriteLine(text);

複数回置換する場合は、メソッドチェーンでつなげることもできます。

C#
string text = "red blue yellow";

string result = text
.Replace("red", "赤")
.Replace("blue", "青")
.Replace("yellow", "黄");

Console.WriteLine(result);

実行結果は次の通りです。

C#
  

3. C#のReplaceで改行・空白・特殊文字を置換する方法

3-1. 改行コードを置換・削除する方法

改行を置換したい場合は、\r\n\nを指定します。

C#
string text = "1行目\r\n2行目\r\n3行目";

string result = text.Replace("\r\n", " ");

Console.WriteLine(result);

実行結果は次の通りです。

C#
1行目 2行目 3行目

改行を削除したい場合は、空文字に置換します。

C#
string text = "1行目\r\n2行目\r\n3行目";

string result = text.Replace("\r\n", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
1行目2行目3行目

ただし、Windows由来の文字列は\r\n、LinuxやWeb API由来の文字列は\nのみの場合があります。そのため、どちらにも対応したい場合は次のように書きます。

C#
string text = "1行目\r\n2行目\n3行目";

string result = text
.Replace("\r\n", "\n")
.Replace("\n", " ");

Console.WriteLine(result);

先に\r\n\nへ統一してから置換すると、処理が分かりやすくなります。

3-2. \r\n・\n・Environment.NewLineの違い

C#で改行を扱うときは、主に次の3つを意識します。

C#
"\r\n"                 // CRLF。Windowsでよく使われる改行
"\n" // LF。Unix/Linux/macOSやWebでよく使われる改行
Environment.NewLine // 実行環境に応じた改行

Environment.NewLineは、現在のプラットフォームや実装に応じた改行文字列を表します。Microsoftのドキュメントでも、Environment.NewLineは現在のプラットフォームに合わせた改行定数であり、C#の\r\nと組み合わせて使えると説明されています。Microsoft Learn

たとえば、実行環境の標準改行を削除したい場合は次のように書けます。

C#
string text = "1行目" + Environment.NewLine + "2行目";

string result = text.Replace(Environment.NewLine, "");

Console.WriteLine(result);

ただし、文字列に含まれる改行コードが必ずしも実行環境と同じとは限りません。たとえば、Windows上で動くアプリでも、Web APIから受け取った文字列には\nだけが含まれていることがあります。

幅広く対応するなら、次のように複数の改行コードを考慮します。

C#
string result = text
.Replace("\r\n", "\n")
.Replace("\r", "\n")
.Replace("\n", " ");

また、現在の.NETではReplaceLineEndingsを使って、複数種類の改行シーケンスを統一する方法もあります。ReplaceLineEndings()は文字列内の改行シーケンスを現在の環境の改行に統一し、ReplaceLineEndings(string replacementText)では指定した文字列に置換できます。Microsoft Learn

C#
string normalized = text.ReplaceLineEndings("\n");

改行の種類が混在しているデータを扱う場合は、ReplaceLineEndingsも選択肢になります。

3-3. 半角スペース・全角スペースを置換・削除する方法

半角スペースを削除する場合は、" "を指定します。

C#
string text = "C# Replace Sample";

string result = text.Replace(" ", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C#ReplaceSample

全角スペースを削除する場合は、" "を指定します。

C#
string text = "C# Replace Sample";

string result = text.Replace(" ", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C#ReplaceSample

半角スペースと全角スペースの両方を削除したい場合は、連続して置換します。

C#
string text = " C# Replace Sample ";

string result = text
.Replace(" ", "")
.Replace(" ", "");

Console.WriteLine(result);

見た目では分かりにくいですが、半角スペースと全角スペースは別の文字です。Replace(" ", "")では全角スペースは削除されません。

3-4. タブ文字を置換・削除する方法

タブ文字は\tで表します。

C#
string text = "名前\t年齢\t住所";

string result = text.Replace("\t", ",");

Console.WriteLine(result);

実行結果は次の通りです。

C#
名前,年齢,住所

タブを削除したい場合は、空文字に置換します。

C#
string text = "C#\tReplace";

string result = text.Replace("\t", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C#Replace

ログファイルやTSVファイルを扱うときに、タブをカンマやスペースへ変換する処理はよく使われます。

3-5. ダブルクォーテーションやバックスラッシュを置換する方法

ダブルクォーテーション"を置換する場合は、エスケープして\"と書きます。

C#
string text = "彼は\"Hello\"と言った";

string result = text.Replace("\"", "'");

Console.WriteLine(result);

実行結果は次の通りです。

C#
彼は'Hello'と言った

バックスラッシュ\を置換する場合は、文字列リテラル内で\\と書きます。

C#
string path = "C:\\Users\\User\\Documents";

string result = path.Replace("\\", "/");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C:/Users/User/Documents

1文字として置換するなら、charで書くこともできます。

C#
string path = "C:\\Users\\User\\Documents";

string result = path.Replace('\\', '/');

Console.WriteLine(result);

バックスラッシュはエスケープ文字として使われるため、"\\"のように書く必要があります。ここを間違えると、コンパイルエラーになったり、意図しない文字列になったりします。

4. C#のReplaceで複数の文字列を置換する方法

4-1. Replaceを連続して呼び出す方法

複数の文字列を置換する最も簡単な方法は、Replaceを連続して呼び出すことです。

C#
string text = "赤 青 黄";

string result = text
.Replace("赤", "red")
.Replace("青", "blue")
.Replace("黄", "yellow");

Console.WriteLine(result);

実行結果は次の通りです。

C#
red blue yellow

少数の置換であれば、この書き方が最も分かりやすいです。

C#
string text = "商品名:りんご、価格:100円";

string result = text
.Replace("商品名:", "")
.Replace("価格:", "")
.Replace("円", "");

Console.WriteLine(result);

ただし、置換対象が多くなると、メソッドチェーンが長くなり、保守しにくくなります。

4-2. 複数条件を順番に置換するときの注意点

Replaceを連続して呼び出す場合、置換は左から順番に実行されます。そのため、置換順によって結果が変わることがあります。

C#
string text = "abc";

string result = text
.Replace("ab", "x")
.Replace("x", "y");

Console.WriteLine(result);

実行結果は次の通りです。

C#
yc

最初にabxへ置換され、その後xyへ置換されるためです。

逆の順番にすると結果は変わります。

C#
string text = "abc";

string result = text
.Replace("x", "y")
.Replace("ab", "x");

Console.WriteLine(result);

実行結果は次の通りです。

C#
xc

複数置換では、「置換後の文字列が、次の置換対象に含まれていないか」を確認することが大切です。

4-3. Dictionaryを使って複数置換する方法

置換ルールが多い場合は、Dictionaryで管理すると見通しがよくなります。

C#
var replacements = new Dictionary<string, string>
{
{ "赤", "red" },
{ "青", "blue" },
{ "黄", "yellow" }
};

string text = "赤 青 黄";

foreach (var pair in replacements)
{
text = text.Replace(pair.Key, pair.Value);
}

Console.WriteLine(text);

実行結果は次の通りです。

C#
red blue yellow

この方法は、置換ルールを設定ファイルやデータベースから読み込むようなケースにも向いています。

ただし、Dictionaryの列挙順に依存した処理は避けた方が安全です。置換順が重要な場合は、Listや配列で順番を明示すると分かりやすくなります。

C#
var replacements = new List<(string OldValue, string NewValue)>
{
("株式会社", "(株)"),
("有限会社", "(有)")
};

string text = "株式会社サンプル";

foreach (var item in replacements)
{
text = text.Replace(item.OldValue, item.NewValue);
}

Console.WriteLine(text);

4-4. 正規表現を使って複数パターンを置換する方法

複数のパターンに一致する文字列をまとめて置換したい場合は、Regex.Replaceが便利です。正規表現は特定の文字パターンを検索・検証・抽出・置換・削除するための強力な仕組みとして説明されています。Microsoft Learn

たとえば、複数の空白文字を1つの半角スペースにまとめる場合は次のように書けます。

C#
using System.Text.RegularExpressions;

string text = "C# Replace\tSample";

string result = Regex.Replace(text, @"\s+", " ");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C# Replace Sample

数字をまとめて*に置換することもできます。

C#
using System.Text.RegularExpressions;

string text = "電話番号は090-1234-5678です";

string result = Regex.Replace(text, @"\d", "*");

Console.WriteLine(result);

実行結果は次の通りです。

C#
電話番号は***-****-****です

Replaceは完全一致の単純置換、Regex.Replaceはパターン一致の置換に向いています。

4-5. 大量置換でパフォーマンスを意識すべきケース

Replaceは便利ですが、文字列はイミュータブルであるため、置換のたびに新しい文字列が作られます。少量の文字列なら問題になりませんが、巨大なログファイルや大量データに対して何度もReplaceを実行する場合、メモリ使用量や処理時間が増えることがあります。

たとえば、次のような処理は置換回数が多いほど負荷が増えます。

C#
string text = largeText;

text = text.Replace("A", "B");
text = text.Replace("C", "D");
text = text.Replace("E", "F");
text = text.Replace("G", "H");

大量の置換ルールがある場合は、次のような方法を検討します。

C#
// 1. 正規表現でまとめて置換する
// 2. StringBuilderを使う
// 3. 置換ルールを整理して回数を減らす
// 4. 入力データを分割して処理する

特にループ内で何度もReplaceを呼ぶ場合は注意が必要です。

C#
foreach (var item in items)
{
text = text.Replace(item.OldValue, item.NewValue);
}

処理対象の文字列が大きい場合は、処理回数や置換順を見直しましょう。

5. 大文字・小文字を区別せずにReplaceする方法

5-1. 通常のReplaceは大文字・小文字を区別する

通常のReplaceは、大文字と小文字を区別します。

C#
string text = "Apple apple APPLE";

string result = text.Replace("apple", "orange");

Console.WriteLine(result);

実行結果は次の通りです。

C#
Apple orange APPLE

"apple"と完全一致する部分だけが置換され、"Apple""APPLE"は置換されません。

5-2. StringComparisonを指定して置換する方法

現在の.NETでは、StringComparisonを指定できるReplaceを使うことで、大文字・小文字を無視した置換ができます。Replace(String, String, StringComparison)は、指定した比較方法を使って検索し、該当箇所を置換するメソッドです。Microsoft Learn

C#
string text = "Apple apple APPLE";

string result = text.Replace(
"apple",
"orange",
StringComparison.OrdinalIgnoreCase
);

Console.WriteLine(result);

実行結果は次の通りです。

C#
orange orange orange

一般的に、プログラム上の識別子や固定キーワードを大文字小文字を無視して置換するなら、StringComparison.OrdinalIgnoreCaseがよく使われます。

C#
string text = "user_id USER_ID User_Id";

string result = text.Replace(
"user_id",
"account_id",
StringComparison.OrdinalIgnoreCase
);

Console.WriteLine(result);

5-3. .NETのバージョンによるReplaceの使い方の違い

StringComparisonを指定するReplaceは、比較的新しい.NETでは利用できますが、古いターゲットフレームワークでは使えない場合があります。

次のコードでコンパイルエラーになる場合があります。

C#
string result = text.Replace(
"apple",
"orange",
StringComparison.OrdinalIgnoreCase
);

その場合は、ターゲットフレームワークを確認してください。古い.NET Frameworkなどでは、Replace(string, string, StringComparison)が使えないことがあります。

使えない環境では、次のような代替方法を使います。

C#
using System.Text.RegularExpressions;

string text = "Apple apple APPLE";

string result = Regex.Replace(
text,
"apple",
"orange",
RegexOptions.IgnoreCase
);

Console.WriteLine(result);

5-4. 古い環境で大文字・小文字を無視して置換する代替方法

古い環境で大文字・小文字を無視したい場合は、Regex.Replaceを使うのが簡単です。

C#
using System.Text.RegularExpressions;

string text = "CSharp csharp CSHARP";

string result = Regex.Replace(
text,
"csharp",
"C#",
RegexOptions.IgnoreCase
);

Console.WriteLine(result);

実行結果は次の通りです。

C#
C# C# C#

ただし、置換対象に.+などの正規表現で特別な意味を持つ文字が含まれる場合は、Regex.Escapeを使うと安全です。

C#
using System.Text.RegularExpressions;

string text = "price+tax PRICE+TAX";
string oldValue = "price+tax";
string newValue = "total";

string result = Regex.Replace(
text,
Regex.Escape(oldValue),
newValue,
RegexOptions.IgnoreCase
);

Console.WriteLine(result);

Regex.Replaceは便利ですが、単純置換に比べると記述がやや複雑です。使える環境であれば、まずはReplaceStringComparison指定を検討するとよいでしょう。

6. C#のReplaceが効かない・置換されない原因と対処法

6-1. Replace後の文字列を代入していない

最も多い原因は、Replaceの戻り値を代入していないことです。

C#
string text = "apple";

text.Replace("apple", "orange");

Console.WriteLine(text);

実行結果は次の通りです。

C#
apple

正しくは次のように書きます。

C#
string text = "apple";

text = text.Replace("apple", "orange");

Console.WriteLine(text);

実行結果は次の通りです。

C#
orange

Replaceは元の文字列を変更せず、新しい文字列を返すことを必ず覚えておきましょう。

6-2. 置換対象の文字列が完全一致していない

Replaceは、指定した文字列と完全に一致した部分だけを置換します。

C#
string text = "C# Replace";

string result = text.Replace("CSharp", "C#");

Console.WriteLine(result);

この場合、"CSharp"は含まれていないため置換されません。

また、余計な空白が含まれているケースもあります。

C#
string text = "C# Replace";

string result = text.Replace("C#Replace", "CSharp");

Console.WriteLine(result);

"C# Replace""C#Replace"は別の文字列なので一致しません。

確認するときは、デバッグ出力で文字列を[]などで囲むと空白に気づきやすくなります。

C#
Console.WriteLine($"[{text}]");

6-3. 改行コードの種類が一致していない

改行を置換できない場合は、\r\n\nの違いを疑いましょう。

C#
string text = "1行目\n2行目";

string result = text.Replace("\r\n", " ");

Console.WriteLine(result);

このコードでは、文字列に含まれているのが\nだけなので、\r\nは一致しません。

複数の改行コードに対応するなら、次のように書きます。

C#
string result = text
.Replace("\r\n", "\n")
.Replace("\r", "\n")
.Replace("\n", " ");

改行が混在するデータでは、最初に改行コードを統一してから処理すると安全です。

6-4. 全角・半角や空白文字の違いに気づいていない

見た目が似ていても、半角スペースと全角スペースは別の文字です。

C#
string text = "C# Replace"; // C#とReplaceの間は全角スペース

string result = text.Replace(" ", "");

Console.WriteLine(result);

このコードでは、半角スペースを指定しているため、全角スペースは削除されません。

全角スペースも削除するなら次のようにします。

C#
string result = text
.Replace(" ", "")
.Replace(" ", "");

タブや改行も空白に見えることがあるため、必要に応じて\t\r\n\nも確認しましょう。

6-5. エスケープ文字の指定方法が間違っている

バックスラッシュやダブルクォーテーションを置換するときは、エスケープの書き方に注意します。

間違いやすい例です。

C#
// 誤り
string result = path.Replace("\", "/");

正しくは次のように書きます。

C#
string result = path.Replace("\\", "/");

ダブルクォーテーションを置換する場合は次のように書きます。

C#
string result = text.Replace("\"", "'");

C#の文字列リテラルでは、\がエスケープ文字として扱われます。そのため、文字としての\を表したい場合は\\と書きます。

6-6. 大文字・小文字の違いで一致していない

通常のReplaceは大文字・小文字を区別します。

C#
string text = "Apple";

string result = text.Replace("apple", "orange");

Console.WriteLine(result);

実行結果は次の通りです。

C#
Apple

大文字・小文字を無視したい場合は、StringComparison.OrdinalIgnoreCaseを使います。

C#
string result = text.Replace(
"apple",
"orange",
StringComparison.OrdinalIgnoreCase
);

古い環境で使えない場合は、Regex.Replaceを使います。

C#
using System.Text.RegularExpressions;

string result = Regex.Replace(
text,
"apple",
"orange",
RegexOptions.IgnoreCase
);

6-7. nullの文字列にReplaceを使って例外が発生している

Replaceはインスタンスメソッドなので、対象の文字列がnullの場合は呼び出せません。

C#
string? text = null;

string result = text.Replace("a", "b");

このコードはNullReferenceExceptionの原因になります。事前にnullチェックをしましょう。

C#
string? text = null;

string result = text?.Replace("a", "b") ?? "";

Console.WriteLine(result);

また、oldValuenullを指定するとArgumentNullException、空文字""を指定するとArgumentExceptionになります。newValuenullを指定した場合は、該当箇所を削除する動作になります。Microsoft Learn

C#
string text = "abc";

// oldValueが空文字なので例外
string result = text.Replace("", "x");

置換対象が変数の場合は、nullや空文字でないかを確認してから実行しましょう。

7. Replaceと関連メソッド・正規表現の使い分け

7-1. ReplaceとRemoveの違い

Replaceは、指定した文字列を別の文字列に置換するメソッドです。

C#
string text = "abcabc";

string result = text.Replace("b", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
acac

一方、Removeは位置と文字数を指定して削除します。

C#
string text = "abcdef";

string result = text.Remove(2, 3);

Console.WriteLine(result);

実行結果は次の通りです。

C#
abf

文字列の内容を指定して消したいならReplace、位置を指定して消したいならRemoveを使います。

7-2. ReplaceとSubstringの違い

Substringは文字列の一部を取り出すメソッドです。

C#
string text = "abcdef";

string result = text.Substring(1, 3);

Console.WriteLine(result);

実行結果は次の通りです。

C#
bcd

Replaceは文字列の一部を置換します。

C#
string text = "abcdef";

string result = text.Replace("bcd", "XYZ");

Console.WriteLine(result);

実行結果は次の通りです。

C#
aXYZef

取り出すならSubstring、置き換えるならReplaceです。

7-3. ReplaceとRegex.Replaceの違い

Replaceは、指定した文字列と完全一致する部分を置換します。

C#
string text = "abc123def";

string result = text.Replace("123", "***");

Console.WriteLine(result);

Regex.Replaceは、正規表現パターンに一致する部分を置換します。

C#
using System.Text.RegularExpressions;

string text = "abc123def456";

string result = Regex.Replace(text, @"\d+", "***");

Console.WriteLine(result);

実行結果は次の通りです。

C#
abc***def***

数字、空白、メールアドレス、日付形式など、パターンで検索したい場合はRegex.Replaceが向いています。

7-4. 単純置換ならReplace、条件付き置換ならRegex.Replaceを使う

使い分けの目安は次の通りです。

C#
// 単純な固定文字列の置換
text.Replace("old", "new");

// パターンに一致する文字列の置換
Regex.Replace(text, @"\d+", "*");

たとえば、"apple""orange"に置換するだけならReplaceで十分です。

C#
string result = text.Replace("apple", "orange");

一方、すべての数字を削除したい場合はRegex.Replaceが便利です。

C#
using System.Text.RegularExpressions;

string result = Regex.Replace(text, @"\d", "");

正規表現は強力ですが、読みやすさや保守性を考えると、単純置換ではReplaceを使う方が適切です。

8. C#のReplaceでよく使う実践例

8-1. 文字列内の不要な文字を削除する

不要な記号を削除する例です。

C#
string text = "090-1234-5678";

string result = text.Replace("-", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
09012345678

カンマを削除して数値変換しやすくする例です。

C#
string priceText = "1,234,567";

string normalized = priceText.Replace(",", "");

int price = int.Parse(normalized);

Console.WriteLine(price);

実行結果は次の通りです。

C#
1234567

8-2. ファイルパスの区切り文字を置換する

Windows形式のパスをURL風の区切りに変換する例です。

C#
string path = "C:\\Users\\User\\Documents\\file.txt";

string result = path.Replace("\\", "/");

Console.WriteLine(result);

実行結果は次の通りです。

C#
C:/Users/User/Documents/file.txt

charで書く場合は次のようにできます。

C#
string result = path.Replace('\\', '/');

ファイルパスを扱う場合は、単純な文字列置換で済ませてよいケースと、Path.CombineなどのSystem.IOの機能を使うべきケースを区別しましょう。

8-3. CSVやログ文字列の整形に使う

ログ内のタブをカンマに変換する例です。

C#
string log = "2026-06-14\tINFO\t処理完了";

string csv = log.Replace("\t", ",");

Console.WriteLine(csv);

実行結果は次の通りです。

C#
2026-06-14,INFO,処理完了

CSV内の不要なダブルクォーテーションを削除する例です。

C#
string csvValue = "\"Apple\"";

string result = csvValue.Replace("\"", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
Apple

ただし、本格的にCSVを解析する場合は、カンマやダブルクォーテーションのエスケープルールが複雑です。簡単な整形ならReplaceで対応できますが、複雑なCSV処理では専用ライブラリの利用も検討しましょう。

8-4. ユーザー入力値を整形する

ユーザーが入力した電話番号からハイフンや空白を削除する例です。

C#
string input = "090 - 1234 - 5678";

string normalized = input
.Replace("-", "")
.Replace(" ", "")
.Replace(" ", "");

Console.WriteLine(normalized);

実行結果は次の通りです。

C#
09012345678

郵便番号の整形にも使えます。

C#
string postalCode = "123-4567";

string normalized = postalCode.Replace("-", "");

Console.WriteLine(normalized);

実行結果は次の通りです。

C#
1234567

ユーザー入力では、半角・全角・空白・改行などが混在することがあります。必要に応じてTrimや正規表現も組み合わせるとよいでしょう。

8-5. HTMLタグや記号を簡易的に置換する

簡易的にHTMLタグを別の文字列に置換する例です。

C#
string html = "<p>Hello</p>";

string result = html
.Replace("<p>", "")
.Replace("</p>", "");

Console.WriteLine(result);

実行結果は次の通りです。

C#
Hello

HTMLエスケープされた文字を戻すような簡易処理にも使えます。

C#
string text = "Tom &amp; Jerry";

string result = text.Replace("&amp;", "&");

Console.WriteLine(result);

実行結果は次の通りです。

C#
Tom & Jerry

ただし、HTML全体を正しく解析する目的でReplaceだけを使うのは危険です。タグの入れ子、属性、エスケープ、改行などを正確に扱う必要がある場合は、HTMLパーサーを使う方が安全です。

9. C#のReplaceを使うときの注意点

9-1. 文字列はイミュータブルであることを理解する

C#のstringはイミュータブルです。Replaceを呼んでも元の文字列は変わらず、置換後の新しい文字列が返されます。

C#
string text = "abc";

text.Replace("a", "x");

Console.WriteLine(text);

実行結果は次の通りです。

C#
abc

正しくは次のように戻り値を使います。

C#
text = text.Replace("a", "x");

Replaceを使うときは、「戻り値を受け取る」ことを必ず意識しましょう。

9-2. Replaceを何度も実行するとメモリ負荷が増える

Replaceは新しい文字列を返すため、何度も実行するとその分だけ新しい文字列が作成されます。

C#
text = text.Replace("A", "B");
text = text.Replace("C", "D");
text = text.Replace("E", "F");

通常の業務アプリや小さな文字列では問題になりにくいですが、大きなテキストを大量に処理する場合は注意が必要です。

大量データでは、次のような工夫を検討します。

C#
// 置換回数を減らす
// 正規表現でまとめて処理する
// StringBuilderを使う
// データを分割して処理する

読みやすさとパフォーマンスのバランスを見ながら選びましょう。

9-3. 置換順によって結果が変わる場合がある

複数のReplaceを連続して使う場合、置換順によって結果が変わることがあります。

C#
string text = "aaa";

string result = text
.Replace("a", "b")
.Replace("b", "c");

Console.WriteLine(result);

実行結果は次の通りです。

C#
ccc

最初にabになり、その後bcになるためです。

もしaだけをbにしたいなら、後続の置換対象に影響しないように順番やルールを見直す必要があります。

C#
string result = text.Replace("a", "b");

複数置換では、置換後の文字列が次の置換対象にならないかを確認しましょう。

9-4. 文化圏や比較ルールを考慮すべきケース

文字列比較では、文化圏によって大文字・小文字の扱いが変わる場合があります。通常のシステム上の固定文字列や識別子を扱う場合は、文化圏に依存しないOrdinal系の比較が使われることが多いです。

C#
string result = text.Replace(
"id",
"ID",
StringComparison.OrdinalIgnoreCase
);

一方、ユーザーに表示される自然言語の文字列を文化圏に応じて処理したい場合は、CurrentCultureIgnoreCaseなどを検討するケースもあります。

C#
string result = text.Replace(
"sample",
"example",
StringComparison.CurrentCultureIgnoreCase
);

単純な英数字のキーワード置換ならOrdinalIgnoreCase、文化圏のルールを考慮したいならCurrentCultureIgnoreCaseというように、目的に合わせて選びましょう。

10. C#のReplaceに関するよくある質問

10-1. Replaceで最初の1回だけ置換できる?

標準のstring.Replaceは、該当するすべての箇所を置換します。最初の1回だけ置換したい場合は、IndexOfで位置を探し、RemoveInsertを組み合わせる方法があります。

C#
string text = "apple apple apple";
string oldValue = "apple";
string newValue = "orange";

int index = text.IndexOf(oldValue);

if (index >= 0)
{
text = text.Remove(index, oldValue.Length)
.Insert(index, newValue);
}

Console.WriteLine(text);

実行結果は次の通りです。

C#
orange apple apple

正規表現を使う場合は、Regex.Replaceの回数指定を使う方法もあります。

C#
using System.Text.RegularExpressions;

string text = "apple apple apple";

string result = Regex.Replace(text, "apple", "orange", RegexOptions.None, TimeSpan.FromSeconds(1));

Console.WriteLine(result);

単純に最初の1回だけ置換したい場合は、IndexOfを使った方法が分かりやすいです。

10-2. Replaceで末尾や先頭だけ置換できる?

Replaceは文字列全体の一致箇所を置換するため、先頭だけ・末尾だけを直接指定するメソッドではありません。

先頭だけ置換したい場合は、StartsWithを使います。

C#
string text = "abc-abc";
string oldValue = "abc";
string newValue = "XYZ";

if (text.StartsWith(oldValue))
{
text = newValue + text.Substring(oldValue.Length);
}

Console.WriteLine(text);

実行結果は次の通りです。

C#
XYZ-abc

末尾だけ置換したい場合は、EndsWithを使います。

C#
string text = "abc-abc";
string oldValue = "abc";
string newValue = "XYZ";

if (text.EndsWith(oldValue))
{
text = text.Substring(0, text.Length - oldValue.Length) + newValue;
}

Console.WriteLine(text);

実行結果は次の通りです。

C#
abc-XYZ

10-3. Replaceで複数行の文字列を置換できる?

できます。Replaceは複数行の文字列にも使えます。

C#
string text = @"1行目
2行目
3行目";

string result = text.Replace("2行目", "置換後の行");

Console.WriteLine(result);

実行結果は次の通りです。

C#
1行目
置換後の行
3行目

改行を含めて置換する場合は、改行コードの種類に注意します。

C#
string text = "1行目\r\n2行目\r\n3行目";

string result = text.Replace("1行目\r\n2行目", "先頭2行");

Console.WriteLine(result);

複数行の文字列で置換できない場合は、\r\n\nの違いを確認しましょう。

10-4. Replaceでnullや空文字を指定するとどうなる?

oldValuenullを指定すると例外になります。

C#
string text = "abc";

string? oldValue = null;

string result = text.Replace(oldValue, "x");

oldValueに空文字""を指定しても例外になります。

C#
string text = "abc";

string result = text.Replace("", "x");

一方、newValuenullを指定した場合は、対象文字列を削除する動作になります。

C#
string text = "abcabc";

string result = text.Replace("b", null);

Console.WriteLine(result);

実行結果は次の通りです。

C#
acac

ただし、可読性を考えると、削除したい場合はnullよりも空文字""を使う方が分かりやすいです。

C#
string result = text.Replace("b", "");

10-5. ReplaceとRegex.Replaceはどちらを使うべき?

固定文字列を置換するだけならReplaceを使うのがおすすめです。

C#
string result = text.Replace("old", "new");

数字、空白、メールアドレス、日付など、パターンに一致する文字列を置換したい場合はRegex.Replaceが向いています。

C#
using System.Text.RegularExpressions;

string result = Regex.Replace(text, @"\d+", "***");

判断の目安は次の通りです。

C#
// 固定文字列の置換
Replace

// パターン指定の置換
Regex.Replace

// 大文字・小文字を無視した単純置換
Replace + StringComparison

// 古い環境で大文字・小文字を無視したい
Regex.Replace + RegexOptions.IgnoreCase

迷った場合は、まずReplaceで実現できるかを考え、条件が複雑になったらRegex.Replaceを検討するとよいでしょう。

まとめ

C#のReplaceは、文字列内の指定した文字や文字列を別の値に置き換えるための基本メソッドです。単純な文字列置換、不要文字の削除、改行や空白の整形、ファイルパスの変換、ユーザー入力値の正規化など、さまざまな場面で使えます。

基本の書き方は次の通りです。

C#
string result = text.Replace("置換前", "置換後");

1文字だけを置換する場合は、charを使います。

C#
string result = text.Replace('-', '/');

不要な文字列を削除する場合は、空文字に置換します。

C#
string result = text.Replace("-", "");

大文字・小文字を区別せずに置換したい場合は、対応している.NET環境でStringComparison.OrdinalIgnoreCaseを指定します。

C#
string result = text.Replace(
"apple",
"orange",
StringComparison.OrdinalIgnoreCase
);

Replaceが効かない場合は、次の点を確認しましょう。

C#
// 戻り値を代入しているか
// 置換対象が完全一致しているか
// 改行コードが一致しているか
// 半角・全角スペースを間違えていないか
// エスケープ文字を正しく書いているか
// 大文字・小文字の違いがないか
// 対象文字列がnullではないか

Replaceは単純置換に強く、Regex.Replaceは条件付き・パターン指定の置換に向いています。まずはReplaceの基本を理解し、改行・空白・複数置換・大文字小文字の扱いまで押さえておくと、C#での文字列処理を安定して書けるようになります。