|
.NET TIPS
正規表現のパターン内にコメント文を記述するには?[C#、VB]
デジタルアドバンテージ 遠藤 孝信
2007/04/12 |
|
|
Regexクラス(System.Text.RegularExpressions名前空間)を利用した正規表現によるパターン・マッチは複雑な文字列処理に威力を発揮するが、正規表現のパターンの記述は複雑で読みにくくなりがちだ。そのような場合には、パターン内にコメント文を入れたり、適当な位置に改行を入れたりすればよい。
ここでは「TIPS:正規表現を使って部分文字列を取得するには?」のサンプル・プログラムで使用した、以下のような正規表現のパターンにコメント文を挿入する場合について解説する。
string anchor =
"<a href=\"(?<url>.*?)\".*?>(?<text>.*?)</a>";
Regex re = new Regex(anchor, RegexOptions.IgnoreCase
| RegexOptions.Singleline);
|
Dim anchor As String = _
"<a href=""(?<url>.*?)"".*?>(?<text>.*?)</a>"
Dim re As = New Regex(anchor, RegexOptions.IgnoreCase _
Or RegexOptions.Singleline)
|
|
正規表現のパターン記述とRegexオブジェクトの作成部分(上:C#、下:VB) |
Regexクラスでは、コンストラクタの第2パラメータで正規表現のオプションをRegexOptions列挙体(System.Text.RegularExpressions名前空間)の値の組み合わせにより指定できるが、パターンにコメント文を入れるには、まずここで「RegexOptions.IgnorePatternWhitespace」を追加する。
このオプション指定により、パターン内の空白文字(およびタブ文字、改行文字など)が無視され、さらに、「#」から行末までがコメント文として扱われるようになる。以下では、C#とVBの場合に分けて解説する。
IgnorePatternWhitespaceオプションを使用したC#による記述
C#では、@記号を使用した、複数行からなるリテラル文字列が利用できるため、次のようにしてパターンを複数行に分割し、行末にコメント文を入れることができる。黄色で示した部分がパターンに対するコメントだ。
string anchor = @"
<a\shref=""
(?<url>.*?) # URL部分
"".*?>
(?<text>.*?) # リンク文字列部分
</a>";
Regex re = new Regex(anchor, RegexOptions.IgnoreCase
| RegexOptions.Singleline
| RegexOptions.IgnorePatternWhitespace);
|
|
パターンを複数行に分割し、行末にコメント文を入れた記述例(C#) |
もともと「<a href」だった部分を「a\shref」に変更している点に注意してほしい。この部分の空白文字は無視されては困るので、これを空白文字を表す「\s」に置き換えている。
IgnorePatternWhitespaceオプションを使用したVBによる記述
VBでは@記号が使えないが、あえて行連結文字「_」(アンダースコア)と改行文字(VbCrLf定数)を用いてC#と同等の記述をすると次のようになる。
Dim anchor As String = _
"<a\shref="" " & VbCrLf & _
" (?<url>.*?) # URL部分 " & VbCrLf & _
" "".*?> " & VbCrLf & _
"(?<text>.*?) # リンク文字列部分 " & VbCrLf & _
"</a> "
Dim re As New Regex(anchor, RegexOptions.IgnoreCase _
Or RegexOptions.Singleline _
Or RegexOptions.IgnorePatternWhitespace)
|
|
パターンを複数行に分割し、行末にコメント文を入れた記述例(VB) |
厳密にはコメント文(#〜)のない行末にはVbCrLf定数を記述する必要はないが、見た目をそろえるためにここでは余分に記述している。
インライン・コメントを使用したVBによる記述
正規表現のパターンにコメント文を付ける別の方法としては、「(?#<コメント文>)」の形式でパターン内に挿入する「インライン・コメント」がある。この形式のコメント文を使用すれば、コメント部分をカッコで囲む必要はあるが、VbCrLf定数の記述は省略できる。
Dim anchor As String = _
"<a\shref="" " & _
" (?<url>.*?) (?# URL部分) " & _
" "".*?> " & _
"(?<text>.*?) (?# リンク文字列部分) " & _
"</a> "
Dim re As New Regex(anchor, RegexOptions.IgnoreCase _
Or RegexOptions.Singleline _
Or RegexOptions.IgnorePatternWhitespace)
|
|
パターンを複数行に分割し、インライン・コメントを使用した記述例(VB) |
このコードではパターン内の空白文字を無視する目的でIgnorePatternWhitespaceオプションを用いている。もちろんC#でもインライン・コメントを利用することはできるが、パターンを複数行に分割する場合には、わざわざインライン・コメントを使う必要性はないだろう。
いずれにしろVBではC#ほどはきれいに記述できない。
カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間)
使用ライブラリ:RegexOptions列挙体(System.Text.RegularExpressions名前空間)
関連TIPS:正規表現を使って部分文字列を取得するには?
|
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間