.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#ほどはきれいに記述できない。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Regexクラス(System.Text.RegularExpressions名前空間)
使用ライブラリ:RegexOptions列挙体(System.Text.RegularExpressions名前空間)
関連TIPS:正規表現を使って部分文字列を取得するには?

この記事と関連性の高い別の.NET TIPS
正規表現を使って文字列から部分文字列を取り除くには?
正規表現を使って文字列がパターンに一致するか調べるには?[C#/VB]
正規表現を使って文字列を置換するには?[C#/VB]
正規表現を使ってパターンに一致する全ての文字列を抽出するには?[C#/VB]
SQL文の文字列を手軽に作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間