【C#】正規表現を使った高度な置換処理 (置換パターンとMatchEvaluator)

String.Replace メソッドは単純な文字列の置き換えしかできませんが、Regex.Replace を使用すると、「パターンに一致した部分の書き換え」や「プログラムによる計算結果への置き換え」といった高度な処理が可能になります。

ここでは、「置換パターン($1, $2…)」 を使ったフォーマット変換と、「ラムダ式(MatchEvaluator)」 を使った動的な値変換の2つの手法を解説します。

目次

1. キャプチャグループと置換パターン ($1, $2…)

正規表現で () を使ってグループ化した部分は、置換文字列の中で $1, $2 という記号を使って参照(再利用)できます。これを使うと、データの並び替えや整形が簡単に行えます。

2. MatchEvaluator (ラムダ式) による動的置換

置換後の文字列を固定値にするのではなく、「一致した数値を計算する」「大文字・小文字を変換する」といったロジックを挟みたい場合は、第3引数にデリゲート(ラムダ式)を指定します。

実装サンプル

以下のコードでは、2つの異なるシナリオを実装しています。

  1. 個人情報のマスク処理: 電話番号の特定の桁を伏せ字にする(置換パターンの利用)。
  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/312025年12月31日)や、HTMLタグの書き換えなどに有効です。

2. MatchEvaluator (動的置換)

  • 仕組み: パターンに一致するたびに指定したメソッド(ラムダ式)が呼び出されます。引数 Match には一致した情報が入っており、戻り値として string を返すと、その部分が置換されます。
  • 用途:
    • 数値の計算(今回の例)
    • 辞書データの参照(IDを名前に変換するなど)
    • 複雑な条件分岐(特定の値のときだけ置換するなど)

この2つを使いこなすことで、単なる文字の置き換えを超えた「テキスト処理プログラム」を簡潔に記述できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次