C#で正規表現のパターンにマッチした文字列の一部分を抽出するコードを紹介します。
概要
正規表現でパターンにマッチした文字列の一部分を取り出すコードを紹介します。
マッチした文字列の一部分を取り出す方法として、正規表現のグループ機能を利用します。
書式
名前なしグループ
グループの参照はMatchオブジェクトのGroupsプロパティを利用します。マッチした文字列は
Value
プロパティの値を参照します。
(Matchオブジェクト).Groups[(グループのインデックス番号)]
名前つきグループ
名前付きグループの書式は次の通りです。
(?<(グループ名)>(グループにマッチする正規表現式))
グループの参照はMatchオブジェクトのGroupsプロパティを利用します。マッチした文字列は
Value
プロパティの値を参照します。
(Matchオブジェクト).Groups["(グループ名)"]
プログラム例 : 名前なしグループ
名前なしグループでの実装例です。
Windows Formアプリケーションを作成します。
UI
下図のフォームを作成します。テキストボックスを2つ、ボタンを1つ配置します。
コード
下記のコードを記述します。
using System;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace RegExMatchGroup
{
public partial class FormGroupMatch : Form
{
public FormGroupMatch()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Regex reg = new Regex("([A-Za-z0-9\\s]*):([A-Za-z0-9\\s]*)");
Match match = reg.Match(textBox1.Text);
if (match.Success == true) {
textBox2.Text += "キー名: " + match.Groups[1].Value.Trim() +"\r\n";
textBox2.Text += "値: " + match.Groups[2].Value.Trim() + "\r\n";
}
else {
textBox2.Text = "みつかりませんでした\r\n";
}
}
}
}
解説
([A-Za-z0-9\\s]*):([A-Za-z0-9\\s]*)
の正規表現でMatchメソッドを実行して検索します。
前半のグループ
([A-Za-z0-9\\s]*)
部分が ":" の手前のグループになります。後半のグループ
([A-Za-z0-9\\s]*)
が":"より後ろのグループになります。
前半のグループが
Group[1]
プロパティに、後半のグループが
Group[2]
に代入されます。
実行結果
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスに
ProductName:PenguinCookie
の文字列を入力します。
[button1]をクリックします。下図の結果がが表示されます。":"文字の前後でキー名と値に分かれて文字を検出できています。
プログラム例 : 名前つきグループ
Windows Formアプリケーションを作成します。
UI
下図のフォームを作成します。テキストボックスを2つ、ボタンを1つ配置します。
コード
下記のコードを記述します。
using System;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace RegExMatchGroup
{
public partial class FormNamedGroupMatch : Form
{
public FormNamedGroupMatch()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Regex reg = new Regex("(?<keyname>[A-Za-z0-9\\s]*):(?<value>[\\w\\s]*)");
Match match = reg.Match(textBox1.Text);
if (match.Success == true) {
textBox2.Text += "キー名: " + match.Groups["keyname"].Value.Trim() + "\r\n";
textBox2.Text += "値: " + match.Groups["value"].Value.Trim() + "\r\n";
}
else {
textBox2.Text = "みつかりませんでした\r\n";
}
}
}
}
解説
(?<keyname>[A-Za-z0-9\\s]*):(?<value>[\\w\\s]*)
の正規表現でMatchメソッドを実行して検索します。
前半のkeynameグループ
(?<keyname>[A-Za-z0-9\\s]*)
部分が ":" の手前の文字列を検出します。
後半のvalueグループ
(?<value>[\\w\\s]*)
が":"より後ろの文字列を検出します。
keynameグループが
Group["keyname"]
プロパティに、valueグループが
Group["value"]
に代入されます。
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
上部のテキストボックスに
ProductName : ぺんぎんクッキー
の文字列を入力します。
[button1]ボタンをクリックします。下図の結果が表示されます。":" の文字の前後でキー名と値それぞれに分かれた文字列が取得できます。
プログラム例 (応用編)
やりたいこと
入力文字列として以下の形式の文字列が与えられます。
与えられた文字列の形式ならば(ページ名)の部分を抜き出します。
UI
下図のUIを準備します。
コード
ボタンのClickイベントにコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace RegExSampleExpressionDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button_ExtractPattern_Click(object sender, EventArgs e)
{
string input = "ga:pagePath=/application/main.aspx";
string output ="";
string expression = "ga:pagePath=(?<page>.*)$";
Regex reg = new Regex(expression);
Match match = reg.Match(input);
if (match.Success == true) {
output = match.Groups["page"].Value;
}
textBox_Input.Text = input;
textBox_Output.Text = output;
textBox_Expression.Text = expression;
}
}
}
解説
正規表現の式を下記としました。"$"は行末を示しています。
グループ名でのキャプチャ
下記の"(?"~")"で囲まれた部分がグループ名でのキャプチャ部分です。"<"~">"で囲まれた"page"がグループ名になります。グループ名の後に続く".*"がグループにマッチする条件式になります。
グループにマッチした部分文字列の取得
マッチしたグループの文字列を取得するコードは下記です。
output = match.Groups["page"].Value;
MatchクラスのGroupsプロパティを用います。
実行結果
アプリケーションを起動し、ボタンをクリックすると下図の画面が表示されます。"="以降の部分文字列が抽出できています。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-08-25
改訂日: 2021-02-21
作成日: 2011-11-24