|
.NET TIPS 正規表現を使って部分文字列を取得するには?[C#、VB]デジタルアドバンテージ 遠藤 孝信2007/04/05 |
![]() |
|
|
|
本稿では、ある文字列内から特定のパターンにマッチする部分文字列を抜き出す処理について、正規表現を使った場合の基本的な手順をまとめる。
ここでは例として、HTMLから、
<a href="URL" ……>テキスト</a>
のような形式のアンカー要素に対して、URL部分とテキスト部分を取り出す場合を考えてみよう。
このようなアンカー要素にマッチする正規表現は次のようになる。
<a href="(?<url>.*?)".*?>(?<text>.*?)</a>
2個所ある「(」と「)」で囲まれた部分は「グループ化」を行っており、それぞれに対して「?<url>」「?<text>」により、「url」と「text」というグループ名を付けている。
ちなみに「.*?>」の部分で使用している「?」は最短一致を指定するもので、「.*?>」は、「>」以外の任意の文字の並び+「>」、を表すことになる(「.*?)」の部分も同様)。
Regexオブジェクトの作成
まず、上記の正規表現を表すRegexクラス(System.Text.RegularExpressions名前空間)のオブジェクトを作成する。
| ||
| Regexオブジェクトの作成(上:C#、下:VB) |
ここでは第2パラメータで2つのオプションを指定している。RegexOptions.IgnoreCaseは大文字小文字を区別せずにマッチするためのものだ。これにより「<A HREF=……」のようなアンカー要素にもマッチするようになる。RegexOptions.Singlelineは任意の1文字を示す「.」を改行文字にもマッチさせるためのものだ。これにより1つのアンカー要素が複数行に渡って記述されていてもマッチするようになる。
Matchオブジェクトの取得
次にマッチングを実行し、最初にマッチした部分をMatchクラス(System.Text.RegularExpressions名前空間)のオブジェクトとして取得する。これにはRegexオブジェクトのMatchメソッドを呼び出す。Matchメソッドのパラメータには、検索対象となるテキストを文字列で指定する(本稿の例ではHTMLの内容)。
| ||
| Matchオブジェクトの取得(上:C#、下:VB) |
ただし、マッチする部分が検索対象に存在しなければ、MatchオブジェクトのSuccessプロパティがfalseとなる。
2番目にマッチした部分は、このようにして得られたMatchオブジェクトに対してNextMatchメソッドを呼び出して取得する。
| ||
| 2番目にマッチした部分のMatchオブジェクトの取得(上:C#、下:VB) |
この場合にもSuccessプロパティにより、マッチした部分が存在するかどうかをチェックする必要がある。以降は芋づる式にNextMatchメソッドを呼び出していけば、すべてのマッチした部分を順に得ることができる。
Matchオブジェクトからグループ化した部分の取り出し
Matchオブジェクトは正規表現にマッチした部分文字列全体を保持しているが、正規表現にてグループ化を行っている場合には、その文字列からグループ化した部分のみを取り出すことができる。
これには次のようにしてMatchオブジェクトのGroupsプロパティでグループ名を指定し、そのValueプロパティにアクセスする。
| ||
| 2番目にマッチした部分のMatchオブジェクトの取得(上:C#、下:VB) |
正規表現内でグループに名前を付けていない場合には、自動的に振られる番号によりGroupsプロパティにアクセスすることになるが、このように名前を付けた方がコードは読みやすくなる。
HTMLからアンカー要素を抜き出すサンプル・プログラム
以上をまとめたサンプル・プログラムを次に示す。
このサンプル・プログラムでは、@ITのトップページ(index.html)を読み込み、そのHTMLからアンカー要素に含まれるURL部分とリンク文字列部分を抜き出して表示する。
| |
| HTMLからアンカー要素のURLとリンク文字列を抜き出すC#のサンプル・プログラム(regexmatch.cs) | |
| |
| HTMLからアンカー要素のURLとリンク文字列を抜き出すVBのサンプル・プログラム(regexmatch.vb) | |
なお、このサンプル・プログラムにより得られるリンク文字列部分は、改行が含まれていたり画像タグ(<img>タグ)のみであったりする場合があるので、実際にリンク一覧などを作成したいときにはさらに加工が必要となる。![]()
| カテゴリ:クラス・ライブラリ 処理対象:文字列 使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間) 使用ライブラリ:RegexOptions列挙体(System.Text.RegularExpressions名前空間) 使用ライブラリ:Matchクラス(System.Text.RegularExpressions名前空間) |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


