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

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]ボタンをクリックします。下図の結果が表示されます。":" の文字の前後でキー名と値それぞれに分かれた文字列が取得できます。

プログラム例 (応用編)

やりたいこと

入力文字列として以下の形式の文字列が与えられます。
与えられた文字列の形式ならば(ページ名)の部分を抜き出します。
ga:pagePath=(ページ名)

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;
    }
  }
}

解説

正規表現の式を下記としました。"$"は行末を示しています。
ga:pagePath=(?<page>.*)$

グループ名でのキャプチャ

下記の"(?"~")"で囲まれた部分がグループ名でのキャプチャ部分です。"<"~">"で囲まれた"page"がグループ名になります。グループ名の後に続く".*"がグループにマッチする条件式になります。
(?<page>.*)

グループにマッチした部分文字列の取得

マッチしたグループの文字列を取得するコードは下記です。
output = match.Groups["page"].Value;
MatchクラスのGroupsプロパティを用います。

実行結果

アプリケーションを起動し、ボタンをクリックすると下図の画面が表示されます。"="以降の部分文字列が抽出できています。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-08-25
改訂日: 2021-02-21
作成日: 2011-11-24
iPentec all rights reserverd.