C#正規表現で複数行テキストを検索!RegexOptions.Multilineの使い方完全ガイド
生徒
「C#のプログラムで、長い文章の中から特定の言葉を探したいんです。でも、文章が何行にも分かれているとうまくいかなくて…。」
先生
「それは『マルチライン(複数行)』の設定が必要かもしれませんね。C#の正規表現には、行がたくさんあっても正しく検索できる魔法のオプションがあるんですよ。」
生徒
「マルチライン?正規表現?難しそうですが、初心者でも使えますか?」
先生
「大丈夫です!一つずつ丁寧に解説していきますね。まずは基本的な考え方から学んでいきましょう。」
1. 正規表現とマルチラインの基本を知ろう
プログラミングの世界には、文章の中から特定のパターンを見つけ出す「正規表現(せいきひょうげん)」という便利な道具があります。 例えば、メールアドレスの形式を探したり、電話番号の数字だけを抜き出したりするときに使われます。
通常、正規表現はひと繋がりの文章を一つの塊として処理しようとします。しかし、私たちが普段目にする文章は、エンターキーを押して「改行」されていることが多いですよね。 この「改行が含まれる複数の行」をまとめて上手に扱う設定のことを、C#ではマルチライン(Multiline)と呼びます。
正規表現を使うための部品は、C#では System.Text.RegularExpressions という名前の場所にまとめられています。
これを使うことで、まるで文章の中から探し物をする探偵のようなプログラムを作ることができるのです。
2. なぜマルチラインの設定が必要なのか
正規表現には「行の先頭」を表す記号(^)と「行の末尾」を表す記号($)があります。 標準的な設定だと、これらは「文章全体の最初」と「文章全体の最後」しか見てくれません。
しかし、住所録やログファイルのように、1行ごとにデータが分かれている場合、各行の先頭や末尾をチェックしたいことがあります。 ここで「マルチラインモード」をオンにすると、改行されるたびにそこを「新しい行の始まり」とみなしてくれるようになります。 この切り替えが、複雑なテキスト処理を成功させる大きな鍵となります。
3. 準備:正規表現を使うための呪文
C#で正規表現を使うには、プログラムの冒頭に「これから正規表現を使いますよ」という宣言を書く必要があります。 これを忘れると、パソコンが「Regex(レジェックス)」という言葉を理解できずにエラーを出してしまいます。
using System;
using System.Text.RegularExpressions; // これが正規表現を使うための呪文です
class Program
{
static void Main()
{
string text = "こんにちは\nさようなら";
Console.WriteLine(text);
}
}
上記のコードにある \n という記号は、パソコンに対して「ここで改行してね」と伝える特別な印です。
これを踏まえて、実際に複数行のテキストから特定の言葉を探す方法を見ていきましょう。
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. すべての行から一致するものを抜き出す
次に、条件に合うものを「一つだけ」ではなく「全部」抜き出す方法を紹介します。
例えば、各行の終わりが特定の文字で終わっている行をすべてリストアップしたい場合です。
「行の終わり」は $ という記号を使って表現します。
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. 複雑な条件で検索する:特定の文字で始まる行全体
今までは一文字だけを探していましたが、実務では「特定の文字で始まる行の、その行の言葉すべて」が欲しいことが多いです。
正規表現の .* という記号を組み合わせると、「その行にあるすべての文字」を表現できます。
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の改行コードの違い
ここで少しだけ、パソコンの仕組みにまつわるお話をします。実は、WindowsとMac(あるいはLinux)では、目に見えない「改行の正体」が少し違います。
Windowsでは \r\n、それ以外では \n という記号が使われることが一般的です。
正規表現のマルチラインモードを使う際、この違いによって $(行末)の判定が微妙に変わることがあります。
もし「うまく行末が判定できないな?」と思ったら、この改行コードの違いを疑ってみてください。
最近のC#であれば多くの場合自動で調整してくれますが、プログラミング初心者の方が最初につまずきやすいポイントの一つです。
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. 正規表現を使いこなすための第一歩
最後に、初心者の方が正規表現を学ぶコツをお伝えします。
最初は ^(先頭)や $(末尾)といった記号の意味を覚えるだけでも十分です。
そして、今回学んだ「マルチライン」が必要になるのは、「改行が含まれるデータ」を扱うときだけだと思い出してください。
パソコンの操作もプログラミングも、最初は誰だって未経験からのスタートです。 一歩ずつ、まずはコードをコピーして動かしてみることから始めてみましょう。 自分の書いたプログラムが思った通りに文章を見つけ出したときの喜びは、プログラミングの醍醐味の一つです。