C#のRegexで名前付きキャプチャグループを取得する方法!初心者向け正規表現ガイド
生徒
「C#を使って、文字列の中から特定の単語だけを抜き出したいのですが、もっと分かりやすく管理する方法はありますか?」
先生
「それなら、正規表現の『名前付きキャプチャグループ』という機能が便利ですよ。抜き出したデータに名前をつけられるんです。」
生徒
「名前にラベルを貼るようなイメージですね!プログラム初心者でも簡単に書けるでしょうか?」
先生
「はい、基本を覚えれば大丈夫です。今回はC#のRegexクラスを使った具体的な書き方を、順番に解説していきますね!」
1. 正規表現とキャプチャグループの基本
プログラミングの世界には、正規表現(せいきひょうげん)という便利な道具があります。英語ではRegex(レジェックス)と呼ばれます。これは、たくさんの文字の中から「特定のパターン」を見つけ出すための特殊な書き方のことです。
例えば、文章の中から「電話番号だけを探したい」とか「メールアドレスだけを抜き出したい」といったときに使います。パソコンに「数字が三つ、ハイフン、数字が四つ……」というルールを伝えて探してもらうイメージです。
そして、今回の主役であるキャプチャグループとは、見つけた文字の中からさらに「ここだけ保存しておいて!」と指定する機能のことです。通常はカッコを使って指定しますが、これに名前(ラベル)を付けることで、後からデータを取り出すのが劇的に簡単になります。
2. 名前付きキャプチャグループの書き方
C#で名前にラベルを付けるには、正規表現のパターンの中に特殊な書き方をします。通常のカッコ () の中に、?<名前> という記号を書き加えるだけです。
たとえば、西暦の「2026年」という文字から「2026」という数字だけを抜き出して、それに「year」という名前を付けたい場合は、次のように書きます。
(?<year>\d+)
ここで使っている \d は「数字」という意味で、+ は「一つ以上続く」という意味です。つまり、「数字が続く部分を見つけて、それに year という名前を付けて保存してね」という命令になります。このように名前を付けることで、プログラムの中で「何番目のデータだっけ?」と迷うことがなくなります。
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. 複数のデータを一気に取得する方法
先ほどの例は一つだけデータを見つける方法でしたが、文章の中にたくさんの同じようなデータがある場合はどうすればよいでしょうか。そんな時は 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. 日付のデータを分解して取得する応用例
次は、もう少し実用的な例を見てみましょう。「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. 知っておくと便利な正規表現の記号たち
名前付きキャプチャグループを使いこなすためには、一緒に使う「記号」の意味を少しずつ覚えていくのが近道です。ここでは、初心者が最初につまずきやすい記号を分かりやすく解説します。
まずは \w(バックスラッシュ ダブリュー) です。これは「英数字やアンダーバー」を指します。ユーザーIDや英単語を探すときに使います。次に \s(バックスラッシュ エス) は「空白(スペースやタブ)」を意味します。文章の隙間を飛ばしたいときに役立ちます。
また、.(ドット) は「何でもいい一文字」という意味の最強のカードです。ただし、使いすぎると意図しない場所まで見つけてしまうことがあるので、.*?(ドット・アスタリスク・クエスチョン) という組み合わせで「次の目印が出てくるまで、最小限の範囲で何でもいい文字を拾う」というテクニックがよく使われます。これを「最短一致(さいたんいっち)」と呼びます。
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. 失敗しないための注意点とコツ
正規表現を使っていると、思った通りに動かないことがあります。そんなときに確認すべきポイントがいくつかあります。まず、大文字と小文字を区別するかどうかです。デフォルトでは区別されますが、もし区別したくない場合は RegexOptions.IgnoreCase という設定を追加します。
また、プログラムの中で @(アットマーク)を文字列の前に付けるのを忘れないようにしましょう。これは 逐次リテラル(ちくじりてらる) と呼ばれ、正規表現の中でよく使う \(バックスラッシュ)をそのまま文字として扱うための魔法のおまじないです。これがないと、C#が別の意味として解釈してしまい、エラーの原因になります。
最後に、複雑なパターンを一気に書こうとしないことです。まずは小さな部分から試して、少しずつ名前付きグループを増やしていくのが、初心者の方が挫折しないための最大のコツです。一つずつ「名前」が付いていく様子を確認しながら進めていきましょう。