String.Replace メソッドは単純な文字列の置き換えしかできませんが、Regex.Replace を使用すると、「パターンに一致した部分の書き換え」や「プログラムによる計算結果への置き換え」といった高度な処理が可能になります。
ここでは、「置換パターン($1, $2…)」 を使ったフォーマット変換と、「ラムダ式(MatchEvaluator)」 を使った動的な値変換の2つの手法を解説します。
目次
1. キャプチャグループと置換パターン ($1, $2…)
正規表現で () を使ってグループ化した部分は、置換文字列の中で $1, $2 という記号を使って参照(再利用)できます。これを使うと、データの並び替えや整形が簡単に行えます。
2. MatchEvaluator (ラムダ式) による動的置換
置換後の文字列を固定値にするのではなく、「一致した数値を計算する」「大文字・小文字を変換する」といったロジックを挟みたい場合は、第3引数にデリゲート(ラムダ式)を指定します。
実装サンプル
以下のコードでは、2つの異なるシナリオを実装しています。
- 個人情報のマスク処理: 電話番号の特定の桁を伏せ字にする(置換パターンの利用)。
- 価格の計算処理: テキスト内の数値を見つけ、消費税を加算した値に書き換える(ラムダ式の利用)。
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
// -------------------------------------------------------
// パターン1: 置換パターン ($1, $2) を使ったフォーマット変更
// -------------------------------------------------------
Console.WriteLine("--- 1. 電話番号のマスク処理 ---");
string personalData = "担当者A: 090-1234-5678, 担当者B: 080-9876-5432";
// 正規表現: (3桁)-(4桁)-(4桁) の数字を検索
// それぞれをグループ () で囲むことで、$1, $2, $3 として参照可能にする
string phonePattern = @"(\d{3})-(\d{4})-(\d{4})";
// 置換指定:
// $1 -> 最初の3桁 (090)
// **** -> 固定の伏せ字
// $3 -> 最後の4桁 (5678)
string maskedData = Regex.Replace(personalData, phonePattern, "$1-****-$3");
Console.WriteLine($"元データ: {personalData}");
Console.WriteLine($"置換結果: {maskedData}");
// -------------------------------------------------------
// パターン2: ラムダ式 (MatchEvaluator) を使った動的な計算置換
// -------------------------------------------------------
Console.WriteLine("\n--- 2. 価格の税込計算処理 ---");
string priceList = "Apple: 100yen, Orange: 250yen, Banana: 80yen";
// 正規表現: 数字の連続 (\d+) を検索
string numberPattern = @"\d+";
// Regex.Replace(入力, パターン, MatchEvaluatorデリゲート)
// 一致した箇所ごとにこのラムダ式が呼ばれる
string taxedList = Regex.Replace(priceList, numberPattern, (Match m) =>
{
// 1. マッチした文字列(数字)を数値型に変換
int price = int.Parse(m.Value);
// 2. 消費税(10%)を加算する計算を行う
int taxIncluded = (int)(price * 1.1);
// 3. 文字列に戻して返す(これが置換後の文字になる)
return taxIncluded.ToString();
});
Console.WriteLine($"元データ: {priceList}");
Console.WriteLine($"税込変換: {taxedList}");
}
}
実行結果
--- 1. 電話番号のマスク処理 ---
元データ: 担当者A: 090-1234-5678, 担当者B: 080-9876-5432
置換結果: 担当者A: 090-****-5678, 担当者B: 080-****-5432
--- 2. 価格の税込計算処理 ---
元データ: Apple: 100yen, Orange: 250yen, Banana: 80yen
税込変換: Apple: 110yen, Orange: 275yen, Banana: 88yen
解説と技術的なポイント
1. 置換パターン ($1, $2…)
- 仕組み: 正規表現内の
()は左から順に番号が振られます(ネストしている場合は外側優先)。 - 用途: 日付形式の変換(
2025/12/31→2025年12月31日)や、HTMLタグの書き換えなどに有効です。
2. MatchEvaluator (動的置換)
- 仕組み: パターンに一致するたびに指定したメソッド(ラムダ式)が呼び出されます。引数
Matchには一致した情報が入っており、戻り値としてstringを返すと、その部分が置換されます。 - 用途:
- 数値の計算(今回の例)
- 辞書データの参照(IDを名前に変換するなど)
- 複雑な条件分岐(特定の値のときだけ置換するなど)
この2つを使いこなすことで、単なる文字の置き換えを超えた「テキスト処理プログラム」を簡潔に記述できます。
