C#で正規表現のパターンにマッチした文字列の一部分を置換で利用するコードを紹介します。
概要
正規表現でパターンにマッチした文字列の一部分を置換の文字列として利用するコードを紹介します。
マッチした文字列の一部分を取り出す方法として、正規表現のグループ機能を利用します。
書式
名前なしグループ
グループの参照は
$(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