正規表現を使用する際、「大文字小文字を区別しない (IgnoreCase)」設定と、「複数行モード (Multiline)」設定を同時に有効にしたい場合があります。
C# の RegexOptions はビットフラグとして定義されているため、ビット演算子の OR (|) を使用することで、複数のオプションを組み合わせて指定することが可能です。
目次
複数オプションの実装例
以下のサンプルコードでは、システムの状態ログ(複数行の文字列)から、Status: で始まる行の値を抽出しています。 ログの書き方が統一されておらず、大文字小文字が混在しているため、2つのオプションを同時に適用して解析します。
サンプルコード
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
// 解析対象のテキスト
// 行ごとにステータスが記録されているが、"Status", "STATUS" と書き方がバラバラ
string logData = "Start process...\n" +
"Status: Ready\n" +
"Processing data...\n" +
"STATUS: Error\n" +
"End process.";
Console.WriteLine("--- 解析対象データ ---");
Console.WriteLine(logData);
Console.WriteLine("----------------------\n");
// 正規表現パターン
// ^ : 行の先頭 (Multilineのおかげで各行の頭にマッチ)
// status: : 文字列 "status:"
// \s* : 空白
// (\w+) : 単語文字の連続をキャプチャ (Ready, Errorなど)
string pattern = @"^status:\s*(\w+)";
// ---------------------------------------------------------
// オプションの結合
// | (ビット論理和) を使って複数のオプションをつなぐ
// 1. IgnoreCase : "status" の大文字小文字を無視
// 2. Multiline : ^ が「文字列全体の先頭」ではなく「各行の先頭」にマッチするようにする
// ---------------------------------------------------------
var options = RegexOptions.IgnoreCase | RegexOptions.Multiline;
MatchCollection matches = Regex.Matches(logData, pattern, options);
Console.WriteLine($"発見数: {matches.Count} 件");
foreach (Match m in matches)
{
// Groups[1] で状態値だけを取り出す
Console.WriteLine($"状態検出: {m.Groups[1].Value}");
}
}
}
実行結果
--- 解析対象データ ---
Start process...
Status: Ready
Processing data...
STATUS: Error
End process.
----------------------
発見数: 2 件
状態検出: Ready
状態検出: Error
解説と技術的なポイント
1. オプションの結合 ( | 演算子)
RegexOptions は [Flags] 属性が付与された列挙型です。そのため、以下のように | (パイプ) 記号を使って必要なだけオプションを連結できます。
// 例:大文字小文字無視、かつ複数行モード、かつコンパイルして高速化
var ops = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled;
2. RegexOptions.Multiline
通常、正規表現の ^(行頭)と $(行末)は、文字列全体の最初と最後のみにマッチします。 このオプションを指定すると、^ と $ の挙動が変わり、改行文字 (\n) で区切られた各行の先頭と末尾にマッチするようになります。ログファイルのような行単位のデータを解析する場合に必須のオプションです。
3. RegexOptions.Singleline(注意点)
名前が似ている RegexOptions.Singleline というオプションもありますが、これは Multiline の逆ではありません。
Multiline:^$が各行にマッチするようになる。Singleline:.(ドット)が改行文字にもマッチするようになる(文字列全体を1行とみなす)。 混乱しやすいので注意してください。
