C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++ STLのmatch_results operator[](添字演算子)の使い方と実例解説

この記事では、C++ STLにおける match_results の添字演算子「[]」の動作、構文、および具体的な使用例について詳しく解説します。

C++ STLにおけるmatch_resultsとは?

std::match_results は、正規表現によるマッチ処理で一致した文字シーケンスのコレクションを格納するための、コンテナ風の特殊なクラスです。このコンテナには、正規表現マッチ操作の結果として、対象シーケンス内で見つかったマッチが保存されます。

match_results operator[]とは?

match_resultsoperator[] は参照演算子であり、match_results オブジェクトのi番目の要素に直接アクセスするために使用されます。この演算子は、オブジェクトに関連付けられたi番目のマッチ位置への参照を返します。インデックスは0から始まるため、特定のマッチ結果へ直接アクセスしたい場合に非常に便利です。

構文

match_results1[int i];

パラメータ

この演算子は、アクセスしたい要素の位置を示す整数型(int)の引数を1つだけ受け取ります。

戻り値

この関数は、マッチ結果オブジェクトのi番目の位置への参照を返します。

入力: string str = "TutorialsPoint";
    regex R("(Tutorials)(.*)");
    smatch Mat;
    regex_match(str, Mat, R);
    Mat[0];
出力: TutorialsPoint

サンプルコード1:すべてのマッチ結果を表示する

#include <bits/stdc++.h>
using namespace std;
int main() {
    string str = "TutorialsPoint";
    regex R("(Tutorials)(.*)");
    smatch Mat;
    regex_match(str, Mat, R);
    for (int i = 0; i < Mat.size(); i++) {
        cout<<"Match is : " << Mat[i]<< endl;
    }
    return 0;
}

出力

上記のコードを実行すると、次のような出力が得られます。

Match is : TutorialsPoint
Match is : Tutorials
Match is : Point

この結果から、Mat[0] には文字列全体のマッチ結果が、Mat[1] 以降には各キャプチャグループに対応するマッチ結果が順番に格納されていることがわかります。

サンプルコード2:最も長いマッチの長さを取得する

#include <bits/stdc++.h>
using namespace std;
int main() {
    string str = "Tutorials Point";
    regex R("(Tutorials)(Point)(.*)");
    smatch Mat;
    regex_match(str, Mat, R);
    int len = 0;
    string S;
    for(int i = 1; i < Mat.size(); i++) {
        if (Mat.length(i) > len) {
            str = Mat[i];
            len = Mat.length(i);
        }
    }
    cout<<"Matching length is : " << len<< endl;
    return 0;
}

出力

上記のコードを実行すると、次のような出力が得られます。

Matching length is : 0

この例の出力が「0」になるのは、対象文字列「Tutorials Point」にスペースが含まれている一方で、正規表現「(Tutorials)(Point)(.*)」がスペースを考慮していないためです。その結果 regex_match() はマッチに失敗し、Mat には何も格納されません。ループ条件 i < Mat.size() が最初から成立しないため、len は初期値の0のまま出力されます。意図した結果を得るには、正規表現側でスペースを許容するパターン(例:「(Tutorials)\s*(Point)(.*)」など)を指定する必要があります。

  1. C++ STL入門:setとunordered_setの違いを徹底解説

    本記事では、C++ STLにおける set と unordered_set の概要をわかりやすく解説し、両者の違いについても詳しく学んでいきます。 setとは? set(セット)は、Key型の一意なオブジェクトをソート済みの状態で格納する連想コンテナです。各要素は一度しか出現できず、重複した値は許されません。ユーザーは任意の順序で要素を挿入してsetを作成できますが、setは常にソートされた形でデータを返します。つまり、setにはデータを並べ替えるための仕組みが内部に組み込まれており、その処理はユーザーから抽象化されています。 setを使うべき主なケースは以下の通りです。 ソート済みのデ

  2. C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード

    C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス