.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");
}
コメントはまだありません。