キャプチャグループ
マッチした部分を抽出します
「キャプチャグループ」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- regexの基礎
- キャプチャグループ
- 検索と置換
- パフォーマンスに関する注意点