SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

RegexDesigner.NETを使って.NETでの正規表現をマスターする

正規表現を使って効率的なテキスト処理を行う


  • X ポスト
  • このエントリーをはてなブックマークに追加

例10:.NETでの正規表現プログラミング

 最後に、.NETのプログラムから正規表現を利用する例を紹介します。「10_プログラムサンプル.rep」を開いてください。

例10-1
例10-1

 RegexDesigner.NETでは、RegExメニューの[Generate Code]をクリックすることによって、.NETで使用できるソースコードの雛形(C#/VB)を生成できます。マッチング(Match)/置換(Replace)/分割(Split)の基本的なコードを生成してくれるので、十分参考にできるでしょう。

RegexDesigner.NETのソースコード生成機能
RegexDesigner.NETのソースコード生成機能

 なお、例1から例9のプログラム例もありますので、例10が難しいと思われた方はダウンロードファイルのサンプルもご覧ください。

.NETでの正規表現関連クラス

 .NETで正規表現を利用したプログラムを行う場合には、System.Text.RegularExpressions名前空間のクラスを利用します。中でも正規表現の中心的クラスであるRegexクラスを最初に理解すると良いでしょう。

 Regexクラスは、インスタンス化する時に、パターン文字列とオプションを指定します。そして、Matchesメソッドからすべてのマッチした文字列を取得できます(置換したい場合はReplaceメソッド、分割したい場合はSplitメソッドを使います)。

正規表現関連オブジェクトの構成
正規表現関連オブジェクトの構成

 正規表現関連オブジェクトの構成は上の図のようになっているため、マッチした文字列から、GroupCaptureといったクラスをたどることで目的のデータを取得することができます(各クラスのメソッドやプロパティなどの詳細については、最後の補足をご覧ください)。

.NETでの正規表現プログラミング

 次のコードは、例10のパターン文字列から、製品群や名前を抽出するプログラムです。

正規表現プログラムの例
private void btnMatch1_Click(object sender, System.EventArgs e)
{
    this.lblResult1.Text = "";
    
    RegexOptions options = RegexOptions.None;
    //パターン文字列の指定
    Regex regex = new Regex(@"(?<製品群>≪.+≫)(?<名前>【.+?】)+", options);
    
    //▼Matches
    MatchCollection matches = regex.Matches(this.txtInput1.Text);
    for( int i = 0; i < matches.Count; i++ )
    {
        //マッチしている要素を取得
        //▼Match
        Match match = matches[i];
        //▼Groups
        GroupCollection groups = match.Groups;
        for( int j = 0; j < groups.Count; j++ )
        {
            //▼Group
            Group group = groups[j];
            //▼Captures
            CaptureCollection captures = group.Captures;
            for( int k = 0; k < captures.Count; k++ )
            {
                //▼Capture
                Capture capture = captures[k];
                this.lblResult1.Text += String.Format(
                    "Matches[{0}] Groups[{1}] Captures[{2}].Value:{3}" +
                    "\r\n",i,j,k,capture.Value);
            }
        }
        this.lblResult1.Text += "\r\n";

    }
}

 まず、Regexクラスをインタスタンス化し、Matchesメソッドからマッチングした内容を取り出しています。マッチした3つの内容を、それぞれGruopCaptureとたどりValueプロパティから値を読み出しています。

 このアプリケーションの実行結果は次のようになります。

例10-3 実行結果
例10-3 実行結果

 この場合は、次のようにデータを読み取ることができました。

データの読み取り結果
データの読み取り結果

 なお、このプログラムではパターンにマッチしたオブジェクトを順に読んでいきましたが、実際のプログラムでは、グループ名を使ってマッチした文字列をダイレクトに読み出すケースも多いでしょう。

 以上、駆け足でしたが正規表現の基本について解説しました。

補足:System.Text.RegularExpressions名前空間のクラス

 補足として、.NETの主要な正規表現関連クラスとメンバについて整理します。

主要な正規表現関連クラスとメンバ
主要な正規表現関連クラスとメンバ
Regexクラス
分類 名前 説明
クラス Regex 正規表現を表す
コンストラクタ Regex(String) 正規表現のパターンを引数に生成する
コンストラクタ Regex(String,RegexOptions) 正規表現のパターンと正規表現のオプションを引数に生成する
メソッド IsMatch() 正規表現と一致したかどうかを返す
メソッド Match() 正規表現と一致する対象を1つ返す
メソッド Matches() 正規表現と一致する対象をすべて返す
メソッド Replace(String, String) 正規表現に一致する対象をすべて置換文字列で置換する
メソッド Replace(String, MatchEvaluator) 正規表現に一致する対象をすべてMatchEvaluaterのメソッドで置換する
メソッド Split(String) 正規表現に一致する対象で分割し、結果をStringの配列で戻す
Captureクラス
分類 名前 説明
クラス Capture 単一のキャプチャの結果を表す
プロパティ Index 一致する文字列が発見された場所
プロパティ Length 一致する文字列の長さ
プロパティ Value キャプチャした文字列
Groupクラス
分類 名前 説明
クラス Group 正規表現に一致したグループを表す(Captureを継承)
プロパティ Captures キャプチャした部分文字列のコレクション
プロパティ Index 一致する文字列が発見された場所
プロパティ Length 一致する文字列の長さ
プロパティ Success 対象が見つかったかどうか
プロパティ Value キャプチャした文字列
Matchクラス
分類 名前 説明
クラス Match 正規表現に一致した結果を表す(Groupを継承)
プロパティ Captures キャプチャした部分文字列のコレクション
プロパティ Index 一致する文字列が発見された場所
プロパティ Length 一致する文字列の長さ
プロパティ Groups 正規表現に一致したグループのコレクション
プロパティ Success 対象が見つかったかどうか
プロパティ Value キャプチャした文字列
その他のクラス等
分類 名前 説明
クラス CaptureCollection キャプチャのコレクション
クラス GroupCollection グループのコレクション
クラス MatchCollection Matchのコレクションクラス
列挙体 RegexOptions マッチングに関するオプション
デリゲート MatchEvaluator 置換に関するデリゲート

 詳細については、こちらのページをご覧ください。

まとめ

 最後に、正規表現についてまとめます。

  • 正規表現はテキストを解析して、マッチング、置換、分割といった処理をする機能です
  • 正規表現ではメタキャラクタを利用してパターンを記述することができます
  • RegexDesigner.NETは.NETの正規表現を簡単に試すことができるフリーのツールです
  • 正規表現を使うと、テキスト処理に関するプログラムを楽に書くことができます
  • .NETでプログラムをする場合には、System.Text.RegularExpressions名前空間のクラスを利用します

 正規表現は、他の言語やツールでも利用できる機能ですので、効率的な作業をするためにも理解に努めておくと良いのではないでしょうか。なお、正規表現には若干の方言がありますので、.NET以外の他の環境で利用するときには、その環境のマニュアルを参照するようにしてください。

参考資料

  1. RegexDesigner.NETの作者サイト:英語
  2. MSDN 『.NET Frameworkの正規表現
  3. MSDN 『How To: ASP.NETへの入力を制約するために正規表現を使用する方法
  4. @IT 『スマートな文字列処理のための正規表現入門
  5. @IT 『Insider.NET会議室 正規表現
  6. module.jp 『WEB+DB PRESS vol19 正規表現記事 PDF
修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/415 2011/05/22 00:38

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング