正規表現を使って部分文字列を取得するには?[C#、VB].NET TIPS

» 2007年04月05日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「.NET TIPS」のインデックス

連載目次

 本稿では、ある文字列内から特定のパターンにマッチする部分文字列を抜き出す処理について、正規表現を使った場合の基本的な手順をまとめる。

 ここでは例として、HTMLから、

<a href="URL" ……>テキスト</a>

のような形式のアンカー要素に対して、URL部分とテキスト部分を取り出す場合を考えてみよう。

 このようなアンカー要素にマッチする正規表現は次のようになる。

<a href="(?<url>.*?)".*?>(?<text>.*?)</a>

 2個所ある「(」と「)」で囲まれた部分は「グループ化」を行っており、それぞれに対して「?<url>」「?<text>」により、「url」と「text」というグループ名を付けている。

 ちなみに「.*?>」の部分で使用している「?」は最短一致を指定するもので、「.*?>」は、「>」以外の任意の文字の並び+「>」、を表すことになる(「.*?)」の部分も同様)。

Regexオブジェクトの作成

 まず、上記の正規表現を表すRegexクラス(System.Text.RegularExpressions名前空間)のオブジェクトを作成する。

Regex reg = new Regex("<a href=\"(?<url>.*?)\".*?>(?<text>.*?)</a>",
                RegexOptions.IgnoreCase | RegexOptions.Singleline);

Dim re As New Regex("<a href=""(?<url>.*?)"".*?>(?<text>.*?)</a>", _
                RegexOptions.IgnoreCase Or RegexOptions.Singleline)

Regexオブジェクトの作成(上:C#、下:VB)

 ここでは第2パラメータで2つのオプションを指定している。RegexOptions.IgnoreCaseは大文字小文字を区別せずにマッチするためのものだ。これにより「<A HREF=……」のようなアンカー要素にもマッチするようになる。RegexOptions.Singlelineは任意の1文字を示す「.」を改行文字にもマッチさせるためのものだ。これにより1つのアンカー要素が複数行に渡って記述されていてもマッチするようになる。

Matchオブジェクトの取得

 次にマッチングを実行し、最初にマッチした部分をMatchクラス(System.Text.RegularExpressions名前空間)のオブジェクトとして取得する。これにはRegexオブジェクトのMatchメソッドを呼び出す。Matchメソッドのパラメータには、検索対象となるテキストを文字列で指定する(本稿の例ではHTMLの内容)。

Match m = reg.Match(<検索対象となる文字列>);

Dim m As Match = reg.Match(<検索対象となる文字列>)

Matchオブジェクトの取得(上:C#、下:VB)

 ただし、マッチする部分が検索対象に存在しなければ、MatchオブジェクトのSuccessプロパティがfalseとなる。

 2番目にマッチした部分は、このようにして得られたMatchオブジェクトに対してNextMatchメソッドを呼び出して取得する。

m = m.NextMatch();

m = m.NextMatch()

2番目にマッチした部分のMatchオブジェクトの取得(上:C#、下:VB)

 この場合にもSuccessプロパティにより、マッチした部分が存在するかどうかをチェックする必要がある。以降は芋づる式にNextMatchメソッドを呼び出していけば、すべてのマッチした部分を順に得ることができる。

Matchオブジェクトからグループ化した部分の取り出し

 Matchオブジェクトは正規表現にマッチした部分文字列全体を保持しているが、正規表現にてグループ化を行っている場合には、その文字列からグループ化した部分のみを取り出すことができる。

 これには次のようにしてMatchオブジェクトのGroupsプロパティでグループ名を指定し、そのValueプロパティにアクセスする。

string url = m.Groups["url"].Value;
string text = m.Groups["text"].Value;

Dim url As String = m.Groups("url").Value
Dim text As String = m.Groups("text").Value

2番目にマッチした部分のMatchオブジェクトの取得(上:C#、下:VB)

 正規表現内でグループに名前を付けていない場合には、自動的に振られる番号によりGroupsプロパティにアクセスすることになるが、このように名前を付けた方がコードは読みやすくなる。

HTMLからアンカー要素を抜き出すサンプル・プログラム

 以上をまとめたサンプル・プログラムを次に示す。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。