複数行コメントにマッチする正規表現

 C#やC言語などのソースコードでは /* 〜 */ を用いることで複数行のコメントを書くことができます。正規表現を用いたパターンマッチングをする際、この書式のコメントにマッチするパターンを作成したくなることもありますが、自力で考えようとしてもなかなか難しいです。

 さて、そのパターンは、以下のとおりです。これで複数行コメントにマッチします。

/\*([^*]|\*[^/])*\*/

 考え方は次の通りです。

  1. /* で始まる
  2. ( * 以外の文字)または( * の次に / 以外の文字)
  3. 直前の繰り返し
  4. */で終わる

 プログラム上では、以下のようにして使います。

private void button1_Click(object sender,EventArgs e)
{
  string input="a/*b/*c*/d/*e\r\ne*/f";
  string pattern=@"/\*([^*]|\*[^/])*\*/";

  MatchCollection matches=Regex.Matches(input,pattern);
  StringBuilder builder=new StringBuilder();
  foreach(Match match in matches)
    builder.AppendFormat("{0} : {1}",match.Index,match.Value)
      .AppendLine();
  MessageBox.Show(builder.ToString());
}

 実行結果(builderの文字列)は次の通りです。

1 : /*b/*c*/
10 : /*e
e*/

 ちゃんと複数行に対応し、2つのコメントにそれぞれマッチしています。