RegexOptions.Singlelineを指定すると、正規表現エンジンは単一行モードで動作するようになります。 単一行モードでは、任意の一文字を表す正規表現要素.
が\n
にもマッチするようになります。 言い換えると、単一行モードでは改行を含む文字列でも、それを改行とみなさず他の文字と同等に処理します。
次の例では、正規表現を用いてfox
から始まりdog
で終わる部分の文字列を抽出しています。 同じ正規表現を用いていても、RegexOptions.Singlelineを指定した場合とそうでない場合で結果が異なっている点に注目してください。
RegexOptions.Singlelineを指定して単一行モードでパターンマッチングを行う
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
// 改行を含む文字列
var text = @"The quick brown
fox jumps over
the lazy dog";
// foxから始まり、任意の文字列を挟んでdogで終わる部分の文字列を表示する
// (単一行モードなので、間に改行\nを含んでいてもマッチする)
Console.WriteLine("[Regex.Match(RegexOptions.Singleline)]");
Console.WriteLine(Regex.Match(text, @"fox.+dog", RegexOptions.Singleline));
Console.WriteLine();
// foxから始まり、任意の文字列を挟んでdogで終わる部分の文字列を表示する
// (単一行モードではないので、間に改行\nを含んでるとマッチしない)
Console.WriteLine("[Regex.Match(RegexOptions.None)]");
Console.WriteLine(Regex.Match(text, @"fox.+dog", RegexOptions.None));
}
}
実行結果
[Regex.Match(RegexOptions.Singleline)] fox jumps over the lazy dog [Regex.Match(RegexOptions.None)]
.
は、None, Singleline, Multilineのいずれを指定した場合でも常に\r
にマッチします。
RegexOptions.Singlelineを指定した場合に動作が変わる正規表現要素とその動作の違いについては、.NET Frameworkで使用できる正規表現 §.RegexOptions.Singlelineと"."の動作の違いも参照してください。