カテゴリ: C# 更新日: 2026/04/09

C#のRegexで名前付きキャプチャグループを取得する方法!初心者向け正規表現ガイド

C#のRegexでキャプチャグループを名前付きで取得する方法
C#のRegexでキャプチャグループを名前付きで取得する方法

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

生徒

「C#を使って、文字列の中から特定の単語だけを抜き出したいのですが、もっと分かりやすく管理する方法はありますか?」

先生

「それなら、正規表現の『名前付きキャプチャグループ』という機能が便利ですよ。抜き出したデータに名前をつけられるんです。」

生徒

「名前にラベルを貼るようなイメージですね!プログラム初心者でも簡単に書けるでしょうか?」

先生

「はい、基本を覚えれば大丈夫です。今回はC#のRegexクラスを使った具体的な書き方を、順番に解説していきますね!」

1. 正規表現とキャプチャグループの基本

1. 正規表現とキャプチャグループの基本
1. 正規表現とキャプチャグループの基本

プログラミングの世界には、正規表現(せいきひょうげん)という便利な道具があります。英語ではRegex(レジェックス)と呼ばれます。これは、たくさんの文字の中から「特定のパターン」を見つけ出すための特殊な書き方のことです。

例えば、文章の中から「電話番号だけを探したい」とか「メールアドレスだけを抜き出したい」といったときに使います。パソコンに「数字が三つ、ハイフン、数字が四つ……」というルールを伝えて探してもらうイメージです。

そして、今回の主役であるキャプチャグループとは、見つけた文字の中からさらに「ここだけ保存しておいて!」と指定する機能のことです。通常はカッコを使って指定しますが、これに名前(ラベル)を付けることで、後からデータを取り出すのが劇的に簡単になります。

2. 名前付きキャプチャグループの書き方

2. 名前付きキャプチャグループの書き方
2. 名前付きキャプチャグループの書き方

C#で名前にラベルを付けるには、正規表現のパターンの中に特殊な書き方をします。通常のカッコ () の中に、?<名前> という記号を書き加えるだけです。

たとえば、西暦の「2026年」という文字から「2026」という数字だけを抜き出して、それに「year」という名前を付けたい場合は、次のように書きます。

(?<year>\d+)

ここで使っている \d は「数字」という意味で、+ は「一つ以上続く」という意味です。つまり、「数字が続く部分を見つけて、それに year という名前を付けて保存してね」という命令になります。このように名前を付けることで、プログラムの中で「何番目のデータだっけ?」と迷うことがなくなります。

3. 実際にコードを書いてみよう(基本編)

3. 実際にコードを書いてみよう(基本編)
3. 実際にコードを書いてみよう(基本編)

それでは、実際にC#のプログラムで名前付きキャプチャグループを使ってみましょう。まずは、名前と年齢が含まれた文字列から、それぞれの情報を抜き出す簡単な例を紹介します。

このプログラムでは、System.Text.RegularExpressions という名前の機能を使います。これは、C#で正規表現を使うために必要な「道具箱」のようなものです。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "名前:田中, 年齢:25歳";
        // 名前を「name」、年齢を「age」として取り出すパターン
        string pattern = @"名前:(?<name>.*?),\s*年齢:(?<age>\d+)歳";

        Match match = Regex.Match(text, pattern);

        if (match.Success)
        {
            // 名前付きグループを使ってデータを取り出す
            string personName = match.Groups["name"].Value;
            string personAge = match.Groups["age"].Value;

            Console.WriteLine("抽出結果:");
            Console.WriteLine("名前は " + personName + " です。");
            Console.WriteLine("年齢は " + personAge + " です。");
        }
    }
}

抽出結果:
名前は 田中 です。
年齢は 25 です。

このコードでは、match.Groups["name"] のように、付けた名前を直接指定して中身を取り出しています。番号で管理するよりも、中身が何であるかが一目でわかるので、ミスが少なくなります。

4. 複数のデータを一気に取得する方法

4. 複数のデータを一気に取得する方法
4. 複数のデータを一気に取得する方法

先ほどの例は一つだけデータを見つける方法でしたが、文章の中にたくさんの同じようなデータがある場合はどうすればよいでしょうか。そんな時は Regex.Matches という命令を使います。これは、見つかったものすべてを「リスト(名簿のようなもの)」として返してくれます。

例えば、商品リストのような文字列から「商品名」と「価格」をすべて抜き出してみましょう。繰り返し処理(foreach文)を使うことで、一つずつ順番に名前付きグループの中身を表示させることができます。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string text = "リンゴ:100円、バナナ:150円、メロン:800円";
        // 商品名を「item」、価格を「price」という名前で取り出す
        string pattern = @"(?<item>.*?):(?<price>\d+)円";

        MatchCollection matches = Regex.Matches(text, pattern);

        Console.WriteLine("在庫リストの確認:");
        foreach (Match m in matches)
        {
            string item = m.Groups["item"].Value;
            string price = m.Groups["price"].Value;
            Console.WriteLine("商品は " + item + "、価格は " + price + " 円です。");
        }
    }
}

在庫リストの確認:
商品は リンゴ、価格は 100 円です。
商品は バナナ、価格は 150 円です。
商品は メロン、価格は 800 円です。

ここで登場した foreach(フォーイーチ) とは、リストの中にあるデータを最初から最後まで順番に取り出して処理するための命令です。これを使えば、データが何個あっても自動で処理してくれます。

5. 日付のデータを分解して取得する応用例

5. 日付のデータを分解して取得する応用例
5. 日付のデータを分解して取得する応用例

次は、もう少し実用的な例を見てみましょう。「2026/04/03」といった日付の形式から、年、月、日をバラバラに取得します。日付データはシステム開発で非常によく使われるため、このテクニックを覚えておくと非常に便利です。

正規表現のパターンを書くときは、/(スラッシュ)などの記号が混ざるため少し複雑に見えますが、落ち着いて名前付きグループ (?<名前>...) を配置していけば難しくありません。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string dateText = "本日の日付は 2026/04/03 です。";
        // 年、月、日をそれぞれ名前付きでキャプチャする
        string pattern = @"(?<year>\d{4})/(?<month>\d{2})/(?<day>\d{2})";

        Match m = Regex.Match(dateText, pattern);

        if (m.Success)
        {
            Console.WriteLine("解析に成功しました!");
            Console.WriteLine("年: " + m.Groups["year"].Value);
            Console.WriteLine("月: " + m.Groups["month"].Value);
            Console.WriteLine("日: " + m.Groups["day"].Value);
        }
    }
}

解析に成功しました!
年: 2026
月: 04
日: 03

ここで使った \d{4} は「数字がちょうど4回続く」という意味です。このように、回数を指定することでより正確にデータを抜き出すことができます。プログラムが自動で「これは年だ」「これは月だ」と判断してくれるのは感動的ですね。

6. 知っておくと便利な正規表現の記号たち

6. 知っておくと便利な正規表現の記号たち
6. 知っておくと便利な正規表現の記号たち

名前付きキャプチャグループを使いこなすためには、一緒に使う「記号」の意味を少しずつ覚えていくのが近道です。ここでは、初心者が最初につまずきやすい記号を分かりやすく解説します。

まずは \w(バックスラッシュ ダブリュー) です。これは「英数字やアンダーバー」を指します。ユーザーIDや英単語を探すときに使います。次に \s(バックスラッシュ エス) は「空白(スペースやタブ)」を意味します。文章の隙間を飛ばしたいときに役立ちます。

また、.(ドット) は「何でもいい一文字」という意味の最強のカードです。ただし、使いすぎると意図しない場所まで見つけてしまうことがあるので、.*?(ドット・アスタリスク・クエスチョン) という組み合わせで「次の目印が出てくるまで、最小限の範囲で何でもいい文字を拾う」というテクニックがよく使われます。これを「最短一致(さいたんいっち)」と呼びます。

7. 文字列の置換に名前付きグループを使う

7. 文字列の置換に名前付きグループを使う
7. 文字列の置換に名前付きグループを使う

名前付きキャプチャグループの凄いところは、ただ抜き出すだけではなく、並び替えや書き換え(置換) にも使える点です。C#の Regex.Replace という機能を使うと、抜き出したパーツを好きな順番で組み立て直すことができます。

例えば、「姓 名」の順番で書かれた名前を、「名(姓)」という形式に変えてみましょう。置換後の文字列の中で ${名前} と書くことで、キャプチャした内容を呼び出すことができます。


using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string input = "田中 太郎";
        // 苗字を「last」、名前を「first」として認識させる
        string pattern = @"(?<last>\w+)\s+(?<first>\w+)";
        
        // 順番を入れ替えて整形する
        string replacement = "${first}(${last})";
        
        string result = Regex.Replace(input, pattern, replacement);

        Console.WriteLine("変換前: " + input);
        Console.WriteLine("変換後: " + result);
    }
}

変換前: 田中 太郎
変換後: 太郎(田中)

このように、データを一度バラバラにしてから別の形に組み立てる作業が、たった数行でできてしまいます。これは、大量の名簿データを整理するときなどに非常に強力な武器になります。

8. 失敗しないための注意点とコツ

8. 失敗しないための注意点とコツ
8. 失敗しないための注意点とコツ

正規表現を使っていると、思った通りに動かないことがあります。そんなときに確認すべきポイントがいくつかあります。まず、大文字と小文字を区別するかどうかです。デフォルトでは区別されますが、もし区別したくない場合は RegexOptions.IgnoreCase という設定を追加します。

また、プログラムの中で @(アットマーク)を文字列の前に付けるのを忘れないようにしましょう。これは 逐次リテラル(ちくじりてらる) と呼ばれ、正規表現の中でよく使う \(バックスラッシュ)をそのまま文字として扱うための魔法のおまじないです。これがないと、C#が別の意味として解釈してしまい、エラーの原因になります。

最後に、複雑なパターンを一気に書こうとしないことです。まずは小さな部分から試して、少しずつ名前付きグループを増やしていくのが、初心者の方が挫折しないための最大のコツです。一つずつ「名前」が付いていく様子を確認しながら進めていきましょう。

カテゴリの一覧へ
新着記事
New1
C#
C#のテストとデバッグ入門!単体テスト・統合テストの基礎を初心者に解説
New2
Azure
Azure SQL Database購入モデル比較!vCoreとDTUの違いと選び方を初心者向けに解説
New3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
New4
COBOL
COBOLのREDEFINES句を完全理解!初心者でもわかる多様なデータ表現と編集の基本
人気記事
No.1
Java&Spring記事人気No1
C#
C#のデリゲートとは?メソッドを変数のように扱う基本を解説
No.2
Java&Spring記事人気No2
C#
C#のプロパティとは?get/setアクセサの書き方と使い分け
No.3
Java&Spring記事人気No3
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.4
Java&Spring記事人気No4
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.5
Java&Spring記事人気No5
Azure
Azure VM(仮想マシン)とは?商用サーバー構築の基本と選定基準を解説
No.6
Java&Spring記事人気No6
Azure
Azure VMサイズの選び方ガイド|Computeからメモリ最適化まで用途別に比較
No.7
Java&Spring記事人気No7
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.8
Java&Spring記事人気No8
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド