【C#】正規表現で複数のオプションを同時に指定する (RegexOptionsの組み合わせ)

正規表現を使用する際、「大文字小文字を区別しない (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行とみなす)。 混乱しやすいので注意してください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次