0Pricing
C++ Academy · レッスン

キャプチャグループ

マッチした部分を抽出します

「キャプチャグループ」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

キャプチャグループとは?

パターン内の括弧はキャプチャグループを作成します。キャプチャグループは一致したテキストの部分を記憶し、後から取り出せるようにします。

  • (\\d+)は連続する数字をキャプチャします。
  • 結果はstd::smatchに格納されます。
#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::smatch m;
    std::string s = "order 42";
    if (std::regex_search(s, m, p)) {
        std::cout << "Captured: " << m[1] << '\n';
    }
    return 0;
}

smatchの結果

std::smatchはマッチの結果を格納します。インデックス[0]はマッチ全体を表し、[1]、[2]、...は順番にキャプチャグループを表します。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+)@(\\w+)");
    std::smatch m;
    std::string s = "user@host";
    if (std::regex_search(s, m, p)) {
        std::cout << "Whole: " << m[0] << '\n';
        std::cout << "User: " << m[1] << ", Host: " << m[2] << '\n';
    }
    return 0;
}

複数のグループ

複数の部分を一度にキャプチャできます。たとえば、日付を年、月、日に分割できます。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d{4})-(\\d{2})-(\\d{2})");
    std::smatch m;
    std::string s = "2026-05-30";
    if (std::regex_match(s, m, p)) {
        std::cout << "Y=" << m[1] << " M=" << m[2] << " D=" << m[3] << '\n';
    }
    return 0;
}

str()、position()、length()

各グループでは、テキストを取得するstr()、入力内のオフセットを取得するposition()、入力内での長さを取得するlength()を使用できます。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::smatch m;
    std::string s = "abc 789 xyz";
    if (std::regex_search(s, m, p)) {
        std::cout << "str: " << m[1].str() << '\n';
        std::cout << "pos: " << m.position(1) << '\n';
        std::cout << "len: " << m.length(1) << '\n';
    }
    return 0;
}

プレフィックスとサフィックス

マッチオブジェクトには、prefix()(マッチの前のテキスト)とsuffix()(マッチの後のテキスト)も用意されています。

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::smatch m;
    std::string s = "left 55 right";
    if (std::regex_search(s, m, p)) {
        std::cout << "prefix: [" << m.prefix() << "]\n";
        std::cout << "suffix: [" << m.suffix() << "]\n";
    }
    return 0;
}

非キャプチャグループ

キャプチャせずにグループ化するには、(?:...)を使います。量指定子や選択のためだけにグループ化したい場合でも、番号付きグループを意味のある状態に保てます。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(?:Mr|Ms) (\\w+)");
    std::smatch m;
    std::string s = "Ms Smith";
    if (std::regex_search(s, m, p)) {
        std::cout << "Name: " << m[1] << '\n';
    }
    return 0;
}

グループがマッチしたかの確認

省略可能なグループは、マッチに参加しないことがあります。サブマッチのmatchedを調べると、何かをキャプチャしたかどうかを確認できます。

#include <iostream>
#include <regex>

int main() {
    std::regex p("file(\\.txt)?");
    std::smatch m;
    std::string s = "file";
    if (std::regex_match(s, m, p)) {
        std::cout << std::boolalpha << "ext matched: " << m[1].matched << '\n';
    }
    return 0;
}

すべてのマッチの反復処理

std::sregex_iteratorは文字列内のすべてのマッチを順にたどり、その過程で各グループを取得します。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\d+)");
    std::string s = "a1 b22 c333";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    for (auto it = begin; it != end; ++it) {
        std::cout << (*it)[1] << '\n';
    }
    return 0;
}

マッチ数のカウント

イテレーターをstd::distanceと組み合わせると、パターンが何回現れるかを数えられます。

#include <iostream>
#include <regex>

int main() {
    std::regex p("\\d+");
    std::string s = "1 22 333 4444";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    std::cout << "Count: " << std::distance(begin, end) << '\n';
    return 0;
}

キーと値のペアの抽出

1回のマッチにつき2つのグループを使うと、key=valueトークンのような単純な構造化テキストを解析できます。

#include <iostream>
#include <regex>

int main() {
    std::regex p("(\\w+)=(\\w+)");
    std::string s = "a=1 b=2 c=3";
    auto begin = std::sregex_iterator(s.begin(), s.end(), p);
    auto end = std::sregex_iterator();
    for (auto it = begin; it != end; ++it) {
        std::cout << (*it)[1] << " -> " << (*it)[2] << '\n';
    }
    return 0;
}

キャプチャの保存

キャプチャしたサブマッチをstr()でstd::stringにコピーすると、マッチオブジェクトが破棄された後もデータを有効な状態に保てます。

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::regex p("v(\\d+)");
    std::smatch m;
    std::string s = "version v7";
    std::string version;
    if (std::regex_search(s, m, p)) {
        version = m[1].str();
    }
    std::cout << "Stored: " << version << '\n';
    return 0;
}

クイックチェック

キャプチャグループのインデックスについて理解度を確認します。

まとめ

キャプチャグループを使ったデータの抽出方法を学びました。

  • 括弧はキャプチャを行い、(?:...)はキャプチャせずにグループ化する
  • smatch[0]はマッチ全体を表し、[1]以降はグループを表す
  • str()、position()、length()、prefix()、suffix()
  • sregex_iteratorですべてのマッチを順にたどる

次は、検索と置換を使ってテキストを変換します。

よくある質問

「キャプチャグループ」レッスンは無料ですか?

はい。「キャプチャグループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「キャプチャグループ」で何を学びますか?

マッチした部分を抽出します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「キャプチャグループ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. regexの基礎
  2. キャプチャグループ
  3. 検索と置換
  4. パフォーマンスに関する注意点
← C++ Academyに戻る