C#で正規表現で複数行にまたがる文字列を検索する

C#で正規表現でパターンに一致する文字列を検索するときに、複数行にまたがる文字列を検索してみます。正規表現そのものについては、MSDNの.NET Framework の正規表現を参考にしてください。

目次

  1. 単一行モードで検索する
  2. 試してみた

単一行モードで検索する

検索するときに使うメソッドには、検索する際のオプションを指定できます。この検索オプションでRegexOptions.Singlelineを指定すると単一行モードで検索されます。 単一行モードでは、改行文字も一つの文字として扱われます。つまり

ABC
DEF

という文字列は、

ABC\r\nDEF\r\n

として扱われます。(Windowsの場合) このモードのメリットは、複数行にまたがる文字列を検索できることです。

試してみた

こんなコードで試してみました。抽出した文字列を標準出力に表示するコンソールアプリです。

using System;
using System.Text.RegularExpressions;

namespace regex_trial3
{
    class Program
    {
        static void Main(string[] args)
        {
            string kotoba = @"(1) いろは
いろはにほへと
ちりぬるを
(2) 五十音
あいうえお
かきくけこ
(3) あるふぁべっと
ABC
DEF
";
            Match matchedObject = Regex.Match(kotoba, @"\(2\).*\(", RegexOptions.Singleline);
            Console.WriteLine(matchedObject.Value);
        }
    }
}

整形済みのテキストから、(2)の項目を抜き出します。これの出力は、こうなります。

(2) 五十音
あいうえお
かきくけこ
(

最後の括弧は要りませんね。というわけで、グループを使ってみます。

using System;
using System.Text.RegularExpressions;

namespace regex_trial3
{
    class Program
    {
        static void Main(string[] args)
        {
            string kotoba = @"(1) いろは
いろはにほへと
ちりぬるを
(2) 五十音
あいうえお
かきくけこ
(3) あるふぁべっと
ABC
DEF
";
            Match matchedObject = Regex.Match(kotoba, @"(\(2\).*)\(", RegexOptions.Singleline);
            Console.WriteLine(matchedObject.Groups[1].Value);
        }
    }
}

抽出した文字列から、さらに最後の文字以外の文字をグループとして抽出するわけですね。結果は下記になります。

(2) 五十音
あいうえお
かきくけこ

実用するにはもうちょっと工夫が要ります。 この投稿で試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop (C#)

公開日

広告