タグ : Multiline

 

.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
 11,923 Total Views