カテゴリ: C# 更新日: 2026/03/31

C#正規表現で複数行テキストを検索!RegexOptions.Multilineの使い方完全ガイド

C#の正規表現でマルチラインテキストを扱う方法
C#の正規表現でマルチラインテキストを扱う方法

先生と生徒の会話形式で理解しよう

生徒

「C#のプログラムで、長い文章の中から特定の言葉を探したいんです。でも、文章が何行にも分かれているとうまくいかなくて…。」

先生

「それは『マルチライン(複数行)』の設定が必要かもしれませんね。C#の正規表現には、行がたくさんあっても正しく検索できる魔法のオプションがあるんですよ。」

生徒

「マルチライン?正規表現?難しそうですが、初心者でも使えますか?」

先生

「大丈夫です!一つずつ丁寧に解説していきますね。まずは基本的な考え方から学んでいきましょう。」

1. 正規表現とマルチラインの基本を知ろう

1. 正規表現とマルチラインの基本を知ろう
1. 正規表現とマルチラインの基本を知ろう

プログラミングの世界には、文章の中から特定のパターンを見つけ出す「正規表現(せいきひょうげん)」という便利な道具があります。 例えば、メールアドレスの形式を探したり、電話番号の数字だけを抜き出したりするときに使われます。

通常、正規表現はひと繋がりの文章を一つの塊として処理しようとします。しかし、私たちが普段目にする文章は、エンターキーを押して「改行」されていることが多いですよね。 この「改行が含まれる複数の行」をまとめて上手に扱う設定のことを、C#ではマルチライン(Multiline)と呼びます。

正規表現を使うための部品は、C#では System.Text.RegularExpressions という名前の場所にまとめられています。 これを使うことで、まるで文章の中から探し物をする探偵のようなプログラムを作ることができるのです。

2. なぜマルチラインの設定が必要なのか

2. なぜマルチラインの設定が必要なのか
2. なぜマルチラインの設定が必要なのか

正規表現には「行の先頭」を表す記号(^)と「行の末尾」を表す記号($)があります。 標準的な設定だと、これらは「文章全体の最初」と「文章全体の最後」しか見てくれません。

しかし、住所録やログファイルのように、1行ごとにデータが分かれている場合、各行の先頭や末尾をチェックしたいことがあります。 ここで「マルチラインモード」をオンにすると、改行されるたびにそこを「新しい行の始まり」とみなしてくれるようになります。 この切り替えが、複雑なテキスト処理を成功させる大きな鍵となります。

3. 準備:正規表現を使うための呪文

3. 準備:正規表現を使うための呪文
3. 準備:正規表現を使うための呪文

C#で正規表現を使うには、プログラムの冒頭に「これから正規表現を使いますよ」という宣言を書く必要があります。 これを忘れると、パソコンが「Regex(レジェックス)」という言葉を理解できずにエラーを出してしまいます。


using System;
using System.Text.RegularExpressions; // これが正規表現を使うための呪文です

class Program
{
    static void Main()
    {
        string text = "こんにちは\nさようなら";
        Console.WriteLine(text);
    }
}

上記のコードにある \n という記号は、パソコンに対して「ここで改行してね」と伝える特別な印です。 これを踏まえて、実際に複数行のテキストから特定の言葉を探す方法を見ていきましょう。

4. 各行の先頭にある文字を見つける方法

4. 各行の先頭にある文字を見つける方法
4. 各行の先頭にある文字を見つける方法

それでは、具体的に「各行の先頭が特定の文字で始まっているか」を判定するプログラムを作ってみましょう。 ここでは RegexOptions.Multiline というオプションを使います。これがマルチラインモードを起動させる合言葉です。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        // 3行のテキストを用意します
        string content = "Apple\nOrange\nBanana";

        // 「行の先頭にある A 」を探すパターンです。^ は先頭を意味します。
        string pattern = "^A";

        // Multilineオプションを指定して検索します
        Match match = Regex.Match(content, pattern, RegexOptions.Multiline);

        if (match.Success)
        {
            Console.WriteLine("行の先頭に A が見つかりました!: " + match.Value);
        }
    }
}

実行結果は以下のようになります。


行の先頭に A が見つかりました!: A

このプログラムでは、3行あるうちの最初の行の先頭にある「A」を見つけ出しています。 もし RegexOptions.Multiline がなかったら、複雑な文章の中ではうまく見つけられないことがあります。

5. すべての行から一致するものを抜き出す

5. すべての行から一致するものを抜き出す
5. すべての行から一致するものを抜き出す

次に、条件に合うものを「一つだけ」ではなく「全部」抜き出す方法を紹介します。 例えば、各行の終わりが特定の文字で終わっている行をすべてリストアップしたい場合です。 「行の終わり」は $ という記号を使って表現します。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        // 各行に果物の名前があるデータ
        string data = "Apple\nBanana\nGrape\nPineapple";

        // 「e」で終わる行を探すパターンです。$ は末尾を意味します。
        string myPattern = "e$";

        // 全体から一致するものをすべて探すには Matches を使います
        MatchCollection results = Regex.Matches(data, myPattern, RegexOptions.Multiline);

        Console.WriteLine("eで終わる行を検索した結果:");
        foreach (Match m in results)
        {
            Console.WriteLine("見つかった文字: " + m.Value);
        }
    }
}

実行結果を見てみましょう。


eで終わる行を検索した結果:
見つかった文字: e
見つかった文字: e
見つかった文字: e

Apple、Grape、Pineappleのそれぞれの行末にある「e」がしっかりと反応していますね。 これがマルチラインモードの力です。行ごとに終わりを判定してくれているのがわかります。

6. 複雑な条件で検索する:特定の文字で始まる行全体

6. 複雑な条件で検索する:特定の文字で始まる行全体
6. 複雑な条件で検索する:特定の文字で始まる行全体

今までは一文字だけを探していましたが、実務では「特定の文字で始まる行の、その行の言葉すべて」が欲しいことが多いです。 正規表現の .* という記号を組み合わせると、「その行にあるすべての文字」を表現できます。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string memo = "1: お買い物に行く\n2: 掃除をする\n1: 友達に電話";

        // 「1: 」で始まる行の、その後の内容すべてを取得するパターン
        string pattern = "^1: .*";

        var matches = Regex.Matches(memo, pattern, RegexOptions.Multiline);

        foreach (Match match in matches)
        {
            Console.WriteLine("本日の予定: " + match.Value);
        }
    }
}

実行結果は以下のようになります。


本日の予定: 1: お買い物に行く
本日の予定: 1: 友達に電話

このように、マルチライン設定を使うことで、メモ帳のようなデータから特定の番号の行だけを抜き出すといった、便利なツールが簡単に作れます。

7. 注意点:WindowsとMacの改行コードの違い

7. 注意点:WindowsとMacの改行コードの違い
7. 注意点:WindowsとMacの改行コードの違い

ここで少しだけ、パソコンの仕組みにまつわるお話をします。実は、WindowsとMac(あるいはLinux)では、目に見えない「改行の正体」が少し違います。 Windowsでは \r\n、それ以外では \n という記号が使われることが一般的です。

正規表現のマルチラインモードを使う際、この違いによって $(行末)の判定が微妙に変わることがあります。 もし「うまく行末が判定できないな?」と思ったら、この改行コードの違いを疑ってみてください。 最近のC#であれば多くの場合自動で調整してくれますが、プログラミング初心者の方が最初につまずきやすいポイントの一つです。

8. RegexOptionsの組み合わせ技

8. RegexOptionsの組み合わせ技
8. RegexOptionsの組み合わせ技

C#の正規表現では、マルチライン以外にも便利なオプションがあります。 例えば、アルファベットの大文字と小文字を区別しないで探したいときは IgnoreCase を使います。 これらは、パイプ記号(|)を使って同時に指定することができます。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "apple\nAPPLE\nApple";

        // 大文字小文字を無視し、かつマルチラインで「行頭のA」を探す
        var options = RegexOptions.Multiline | RegexOptions.IgnoreCase;
        var results = Regex.Matches(text, "^a", options);

        Console.WriteLine("見つかった数: " + results.Count);
    }
}

実行結果:


見つかった数: 3

このように、複数の設定を組み合わせることで、より柔軟に文章を解析できるようになります。 「マルチライン」と「大文字小文字無視」は非常によく使う組み合わせなので、セットで覚えておくと便利ですよ。

9. 正規表現を使いこなすための第一歩

9. 正規表現を使いこなすための第一歩
9. 正規表現を使いこなすための第一歩

最後に、初心者の方が正規表現を学ぶコツをお伝えします。 最初は ^(先頭)や $(末尾)といった記号の意味を覚えるだけでも十分です。 そして、今回学んだ「マルチライン」が必要になるのは、「改行が含まれるデータ」を扱うときだけだと思い出してください。

パソコンの操作もプログラミングも、最初は誰だって未経験からのスタートです。 一歩ずつ、まずはコードをコピーして動かしてみることから始めてみましょう。 自分の書いたプログラムが思った通りに文章を見つけ出したときの喜びは、プログラミングの醍醐味の一つです。

カテゴリの一覧へ
新着記事
New1
C#
C#正規表現で複数行テキストを検索!RegexOptions.Multilineの使い方完全ガイド
New2
Azure
Azureの高可用性設計をマスター!リージョン・可用性セット・可用性ゾーンの基礎知識
New3
COBOL
COBOLのCORRESPONDING句を徹底解説!初心者でもわかる同名項目のまとめ処理
New4
COBOL
COBOLの共有領域(WORKING‑STORAGE)の設計ベストプラクティス!初心者でもわかる変数設計とメモリ管理
人気記事
No.1
Java&Spring記事人気No1
COBOL
COBOLのバッチ処理とは?基本構成と役割を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
C#
C#のasyncとawaitの基本的な使い方をマスターしよう!非同期処理をやさしく解説
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.5
Java&Spring記事人気No5
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.6
Java&Spring記事人気No6
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.7
Java&Spring記事人気No7
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.8
Java&Spring記事人気No8
C#
C#のライブラリとは?標準ライブラリと外部ライブラリの違いと使い方をやさしく解説!