.NET 正規表現におけるRegexOptions.Multilineの挙動について

C#、VB.NETで正規表現による検索を行う際、オプションに「Multiline」を指定してもパターンにマッチしない場合があります。
 
たとえばパターンに「@"^\d+$"」を指定して以下の文字列を検索すると、最終行の「789」にしかマッチしません。
 
abc
123
456
789
 
これはパターンの「$」が「改行コード (\n) または入力文字列の末尾と一致する」ように動きますが、「復帰と改行コード(\r\n)の組み合わせとは一致しない」仕様のためです。
 
 
この現象は「$」の代わりに部分式「\r?$」を用いることで回避できます。
 
パターンに「@"^\d+\r?$"」を指定した場合、
 
abc
123
456
789
 
となりますが、これでは改行コードまでマッチしてしまいました。上記例でパターンにマッチした数字のみ必要な場合は、パターンに「@"(^\d+)(\r?$)"」を指定し、マッチした文字列から「$1」にて部分文字列を抽出します。
 
以下はパターンにマッチした数字をシングルコートで囲うサンプルです。
 
        // 数字で始まり数字で終わる行の数字をシングルコートで囲います
        private string AddSingleCoat(string target)
        {
            Regex numberCR = new Regex(@"(^\d+)(\r?$)",
                RegexOptions.Multiline);

            return numberCR.Replace(target, "'$1'$2");
        }

g h T
 12,218 Total Views

ADVERTISING

駅チカ!ホテル検索
全国の駅や目的地近くの宿泊施設を検索し予約することができます。最寄駅沿線からもホテルを検索できるので、アクセスのよいホテルを予約することが可能です。
  1. コメントはまだありません。

  1. トラックバックはまだありません。