[C#] 正規表現でのグルーピングとキャプチャ

スポンサーリンク

はじめに

正規表現において、グルーピングキャプチャは複雑なパターンを扱う際に欠かせない機能です。C# では、System.Text.RegularExpressions 名前空間を使って、これらを効率的に利用できます。本記事では、グルーピングとキャプチャの基本から実践的な使い方までを徹底解説します。

 

グルーピングとキャプチャの基本

グルーピングとは?

  • グルーピングは、正規表現のパターンを括弧 () で囲むことで、部分的にまとめる機能です。
  • グループ化することで、以下の操作が可能になります:
    • 部分一致を取得する(キャプチャ)
    • 特定のパターンに繰り返しや条件を適用する

キャプチャとは?

  • キャプチャは、グループに一致した部分文字列を抽出する機能です。
  • 一致した部分文字列は、キャプチャグループとして Match オブジェクトからアクセスできます。

基本的な構文

  • (): グループを作成し、キャプチャする。
  • (?:...): グループ化するが、キャプチャしない(非キャプチャグループ)。
  • (?<name>...): 名前付きキャプチャグループ。

 

グルーピングを使った検索の例

電話番号の抽出

以下のコードは、電話番号を抽出し、各部分(市外局番・中央部分・下位部分)をキャプチャします。

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string pattern = @"(\d{3})-(\d{3})-(\d{4})";
        string input = "電話番号は 123-456-7890 です。";

        Match match = Regex.Match(input, pattern);
        if (match.Success)
        {
            Console.WriteLine($"全体一致: {match.Value}");
            Console.WriteLine($"市外局番: {match.Groups[1].Value}");
            Console.WriteLine($"中央部分: {match.Groups[2].Value}");
            Console.WriteLine($"下位部分: {match.Groups[3].Value}");
        }
    }
}

出力結果

全体一致: 123-456-7890
市外局番: 123
中央部分: 456
下位部分: 7890

解説

  • (\d{3}) は市外局番をキャプチャします。
  • (\d{3})(\d{4}) はそれぞれ中央部分と下位部分をキャプチャします。

 

名前付きキャプチャの使用例

名前付きキャプチャを使うと、グループに名前を付けて分かりやすく管理できます。

名前付きキャプチャで日付を抽出

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string pattern = @"(?\d{4})-(?\d{2})-(?\d{2})";
        string input = "日付: 2024-11-21";

        Match match = Regex.Match(input, pattern);
        if (match.Success)
        {
            Console.WriteLine($"年: {match.Groups["Year"].Value}");
            Console.WriteLine($"月: {match.Groups["Month"].Value}");
            Console.WriteLine($"日: {match.Groups["Day"].Value}");
        }
    }
}

出力結果

年: 2024
月: 11
日: 21

解説

  • (?<Year>\d{4}): 4桁の数字を「Year」という名前のグループとしてキャプチャ。
  • 同様に、「Month」や「Day」という名前を付けています。

 

応用例: 複数のデータ抽出

複数の同形式データをまとめて抽出することも可能です。

文章中のメールアドレスをすべて抽出

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string pattern = @"([\w\.-]+)@([\w\.-]+)\.(\w+)";
        string input = "連絡先: user1@example.com, admin@domain.org";

        MatchCollection matches = Regex.Matches(input, pattern);
        foreach (Match match in matches)
        {
            Console.WriteLine($"全体一致: {match.Value}");
            Console.WriteLine($"ユーザー名: {match.Groups[1].Value}");
            Console.WriteLine($"ドメイン名: {match.Groups[2].Value}");
            Console.WriteLine($"トップレベルドメイン: {match.Groups[3].Value}");
        }
    }
}

出力結果

全体一致: user1@example.com
ユーザー名: user1
ドメイン名: example
トップレベルドメイン: com

全体一致: admin@domain.org
ユーザー名: admin
ドメイン名: domain
トップレベルドメイン: org

 

ベストプラクティス

名前付きキャプチャを活用

  • 名前を付けることでコードの可読性が向上します。

非キャプチャグループを使う

  • 必要ないキャプチャは (?:...) を使うことで無駄な処理を避けられます。

複雑な正規表現をコメント付きで書く

  • 大規模なパターンは、分かりやすいコメントや分割を行いましょう。

 

まとめ

C# の正規表現でグルーピングとキャプチャを活用することで、以下が可能になります:

  1. データの特定部分を抽出。
  2. 名前付きキャプチャでコードを直感的に記述。
  3. 複数のデータを効率的に処理。

これらのテクニックを活用して、複雑な文字列操作を簡単に解決しましょう!

Please follow and like us:

コメント

タイトルとURLをコピーしました