例10:.NETでの正規表現プログラミング
最後に、.NETのプログラムから正規表現を利用する例を紹介します。「10_プログラムサンプル.rep」を開いてください。
RegexDesigner.NETでは、RegExメニューの[Generate Code]をクリックすることによって、.NETで使用できるソースコードの雛形(C#/VB)を生成できます。マッチング(Match)/置換(Replace)/分割(Split)の基本的なコードを生成してくれるので、十分参考にできるでしょう。
なお、例1から例9のプログラム例もありますので、例10が難しいと思われた方はダウンロードファイルのサンプルもご覧ください。
.NETでの正規表現関連クラス
.NETで正規表現を利用したプログラムを行う場合には、System.Text.RegularExpressions名前空間のクラスを利用します。中でも正規表現の中心的クラスであるRegex
クラスを最初に理解すると良いでしょう。
Regex
クラスは、インスタンス化する時に、パターン文字列とオプションを指定します。そして、Matches
メソッドからすべてのマッチした文字列を取得できます(置換したい場合はReplace
メソッド、分割したい場合はSplit
メソッドを使います)。
正規表現関連オブジェクトの構成は上の図のようになっているため、マッチした文字列から、Group
、Capture
といったクラスをたどることで目的のデータを取得することができます(各クラスのメソッドやプロパティなどの詳細については、最後の補足をご覧ください)。
.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つの内容を、それぞれGruop
、Capture
とたどりValue
プロパティから値を読み出しています。
このアプリケーションの実行結果は次のようになります。
この場合は、次のようにデータを読み取ることができました。
なお、このプログラムではパターンにマッチしたオブジェクトを順に読んでいきましたが、実際のプログラムでは、グループ名を使ってマッチした文字列をダイレクトに読み出すケースも多いでしょう。
以上、駆け足でしたが正規表現の基本について解説しました。
補足:System.Text.RegularExpressions名前空間のクラス
補足として、.NETの主要な正規表現関連クラスとメンバについて整理します。
分類 | 名前 | 説明 |
クラス | Regex |
正規表現を表す |
コンストラクタ | Regex(String) |
正規表現のパターンを引数に生成する |
コンストラクタ | Regex(String,RegexOptions) |
正規表現のパターンと正規表現のオプションを引数に生成する |
メソッド | IsMatch() |
正規表現と一致したかどうかを返す |
メソッド | Match() |
正規表現と一致する対象を1つ返す |
メソッド | Matches() |
正規表現と一致する対象をすべて返す |
メソッド | Replace(String, String) |
正規表現に一致する対象をすべて置換文字列で置換する |
メソッド | Replace(String, MatchEvaluator) |
正規表現に一致する対象をすべてMatchEvaluater のメソッドで置換する |
メソッド | Split(String) |
正規表現に一致する対象で分割し、結果をString の配列で戻す |
分類 | 名前 | 説明 |
クラス | Capture |
単一のキャプチャの結果を表す |
プロパティ | Index |
一致する文字列が発見された場所 |
プロパティ | Length |
一致する文字列の長さ |
プロパティ | Value |
キャプチャした文字列 |
分類 | 名前 | 説明 |
クラス | Group |
正規表現に一致したグループを表す(Capture を継承) |
プロパティ | Captures |
キャプチャした部分文字列のコレクション |
プロパティ | Index |
一致する文字列が発見された場所 |
プロパティ | Length |
一致する文字列の長さ |
プロパティ | Success |
対象が見つかったかどうか |
プロパティ | Value |
キャプチャした文字列 |
分類 | 名前 | 説明 |
クラス | Match |
正規表現に一致した結果を表す(Group を継承) |
プロパティ | Captures |
キャプチャした部分文字列のコレクション |
プロパティ | Index |
一致する文字列が発見された場所 |
プロパティ | Length |
一致する文字列の長さ |
プロパティ | Groups |
正規表現に一致したグループのコレクション |
プロパティ | Success |
対象が見つかったかどうか |
プロパティ | Value |
キャプチャした文字列 |
分類 | 名前 | 説明 |
クラス | CaptureCollection |
キャプチャのコレクション |
クラス | GroupCollection |
グループのコレクション |
クラス | MatchCollection |
Match のコレクションクラス |
列挙体 | RegexOptions |
マッチングに関するオプション |
デリゲート | MatchEvaluator |
置換に関するデリゲート |
詳細については、こちらのページをご覧ください。
まとめ
最後に、正規表現についてまとめます。
- 正規表現はテキストを解析して、マッチング、置換、分割といった処理をする機能です
- 正規表現ではメタキャラクタを利用してパターンを記述することができます
- RegexDesigner.NETは.NETの正規表現を簡単に試すことができるフリーのツールです
- 正規表現を使うと、テキスト処理に関するプログラムを楽に書くことができます
- .NETでプログラムをする場合には、System.Text.RegularExpressions名前空間のクラスを利用します
正規表現は、他の言語やツールでも利用できる機能ですので、効率的な作業をするためにも理解に努めておくと良いのではないでしょうか。なお、正規表現には若干の方言がありますので、.NET以外の他の環境で利用するときには、その環境のマニュアルを参照するようにしてください。
参考資料
- RegexDesigner.NETの作者サイト:英語
- MSDN 『.NET Frameworkの正規表現』
- MSDN 『How To: ASP.NETへの入力を制約するために正規表現を使用する方法』
- @IT 『スマートな文字列処理のための正規表現入門』
- @IT 『Insider.NET会議室 正規表現』
- module.jp 『WEB+DB PRESS vol19 正規表現記事 PDF』