パターンにマッチした文字列の一部分を置換で利用する (Regex 正規表現のグループを利用) - C#

C#で正規表現のパターンにマッチした文字列の一部分を置換で利用するコードを紹介します。

概要

正規表現でパターンにマッチした文字列の一部分を置換の文字列として利用するコードを紹介します。 マッチした文字列の一部分を取り出す方法として、正規表現のグループ機能を利用します。

書式

名前なしグループ

((グループにマッチする正規表現式))
グループの参照は$(n) 記述で参照します。
$(n)

名前つきグループ

名前付きグループの書式は次の通りです。
(?<(グループ名)>(グループにマッチする正規表現式))
グループの参照は${...} 記述で参照します。
${(グループ名)}

プログラム例 : 名前なしグループ

Windows Formアプリケーションを作成します。

UI

下図のフォームを作成します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RegExReplaceGroup
{
  public partial class FormGroupReplace : Form
  {
    public FormGroupReplace()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string output = Regex.Replace(textBox1.Text,@"Product\((.*)\)","name=\"$1\"");
      textBox2.Text += output;
    }
  }
}

解説

textBox1 に入力された文字列を置換します。置換パターンは Product\((.*)\) としており、Products(...) の文字列の ... の部分をグループとして取得します。 置換文字列は name="$1" としており、入力された文字列の Products(...) の ... の部分を用いて name="..." の文字列を置換結果として出力します。
  string output = Regex.Replace(textBox1.Text,@"Product\((.*)\)","name=\"$1\"");

実行結果

上記のプロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに 「Product(ぺんぎんクッキー)」 の文字列を入力します。ぺんぎんクッキー の部分がグループの文字列になります。
入力後[button1]をクリックします。


下部のテキストボックスに 「name="ぺんぎんクッキー"」の文字列が表示されます。

プログラム例 : 名前なしグループ(複数)

UI

下図のフォームを作成します。ボタンが2つ配置されていますが、今回のデモでは[button2]のみを利用します。

コード

下記コードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RegExReplaceGroup
{
  public partial class FormGroupReplace : Form
  {
    public FormGroupReplace()
    {
      InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string output = Regex.Replace(textBox1.Text, @"([A-Za-z0-9]*):(.*):([0-9]*)", "$2 - $3 ($1)");
      textBox2.Text += output;
    }
  }
}

解説

textBox1 に入力された文字列を置換します。置換パターンは ([A-Za-z0-9]*):(.*):([0-9]*) を設定しています。: で3つの値を区切り、最初の英数文字の値をグループ1、 2番目の文字列をグループ2、3つ目の数値の文字列をグループ3に設定します。
置換文字列は $2 - $3 ($1) を指定しており、[グループ2の値] - [グループ3の数値] ([グループ1の英数]) の形式で置換されます。~
  string output = Regex.Replace(textBox1.Text, @"([A-Za-z0-9]*):(.*):([0-9]*)", "$2 - $3 ($1)");

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに「PRD001:ぺんぎんクッキー:350」の文字列を入力します。入力後[button2]をクリックします。


下部のテキストボックスに「ぺんぎんクッキー - 350 (PRD001)」の文字列が表示されます。入力された文字列が置換できました。

プログラム例 : 名前つきグループ

UI

下図のフォームを作成します。ボタンが3つ配置されていますが、今回のデモでは[button3]のみを利用します。

コード

下記コードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RegExReplaceGroup
{
  public partial class FormGroupReplace : Form
  {
    public FormGroupReplace()
    {
      InitializeComponent();
    }
    private void button3_Click(object sender, EventArgs e)
    {
      string output = Regex.Replace(textBox1.Text, @"call\((?<func>[A-Za-z]*),(?<param>[0-9]*)\)",@"${func}(${param})");
      textBox2.Text += output;
    }
  }
}

解説

textBox1 に入力された文字列を置換します。置換パターンは call\((?<func>[A-Za-z]*),(?<param>[0-9]*)\) を設定しています。 call()の括弧内の最初のカンマまでの文字列をfuncグループ、カンマ以降の数値をparamグループとします。
置換文字列は ${func}(${param}) としており、[funcグループの値]([paramグループの数値]) の形式で置換されます。~
  string output = Regex.Replace(textBox1.Text, @"call\((?<func>[A-Za-z]*),(?<param>[0-9]*)\)",@"${func}(${param})");

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに "Call(GetItemList,42)" の文字列を入力します。入力後[button3]ボタンをクリックします。


置換処理が実行され、下部のテキストボックスに "GetItemList(42)" の文字列が表示されます。パターン内のグループの値を利用して、置換処理ができています。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-12-17
作成日: 2022-12-16
iPentec all rights reserverd.