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

【C++】match_results::prefix()とsuffix()で正規表現マッチ前後の文字列を取得する方法

本記事では、C++ STLに用意されている match_results::prefix() 関数と match_results::suffix() 関数について、その動作・構文・具体的な使用例を詳しく解説します。

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

std::match_results は、正規表現によるマッチ操作の結果として得られた文字シーケンスのコレクションを格納するための、コンテナのような特殊なクラステンプレートです。このコンテナクラスに対して正規表現マッチ操作を行うことで、対象シーケンス内の一致箇所が検索され、その結果が保存されます。

match_results::prefix()とは?

match_results::prefix() 関数は、C++ STLの組み込み関数の一つで、<regex> ヘッダーで定義されています。prefix() は、マッチ結果オブジェクトのうち、マッチした部分より前(前方)にあるシーケンスを取得するために使用されます。この関数は、マッチしたシーケンスの直前に存在する文字列またはシーケンスへのconst参照を返します。

構文

match_results.prefix();

パラメータ

この関数は引数を受け取りません。

戻り値

マッチしたシーケンスの直前にある文字列またはシーケンスへのconst参照を返します。

prefix()の使用例

まずは、動作イメージをつかむための簡単な入力・出力例です。

入力: string str = "Tutorials Points";
    regex R("Points");
    smatch Mat;
    regex_search(str, Mat, R);
    Mat.prefix();
出力: Tutorials

続いて、prefix()関数を使った実際のプログラム例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int main() {
    string str = "Tutorials Points";
    regex R("Points");
    smatch Mat;
    regex_search(str, Mat, R);
    cout<<"マッチの前方の文字列 : ";
    if (!Mat.empty()) {
        cout << Mat.prefix();
    }
    return 0;
}

出力

上記のコードを実行すると、以下の出力が得られます。

マッチの前方の文字列 : Tutorials

この例では、正規表現 Points が文字列 Tutorials Points 内で見つかり、そのマッチ位置より前方にある Tutorials が prefix として出力されています。

match_results::suffix()とは?

match_results::suffix() 関数も、C++ STLの組み込み関数の一つで、<regex> ヘッダーで定義されています。suffix() は、マッチ結果オブジェクトのうち、マッチした部分より後(後方)にあるシーケンスを取得するために使用されます。この関数は、マッチしたシーケンスの直後に続く文字列またはシーケンスへのconst参照を返します。

構文

match_results.suffix();

パラメータ

この関数は引数を受け取りません。

戻り値

マッチしたシーケンスの直後に続く文字列またはシーケンスへのconst参照を返します。

suffix()の使用例

まずは、動作イメージをつかむための簡単な入力・出力例です。

入力: std::string str("Tutorials Points is the best");
    std::smatch Mat;
    std::regex re("Points");
    std::regex_search(str, Mat, re);
    Mat.suffix();
出力: is the best

続いて、suffix()関数を使った実際のプログラム例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int main() {
    string str = "Tutorials Points is the best";
    regex R("Points");
    smatch Mat;
    regex_search(str, Mat, R);
    cout<<"マッチの後方の文字列 : ";
    if (!Mat.empty()) {
        cout << Mat.suffix();
    }
    return 0;
}

出力

上記のコードを実行すると、以下の出力が得られます。

マッチの後方の文字列 : is the best

この例では、正規表現 Points のマッチ位置より後方にある is the best が suffix として出力されています。

まとめ

match_results::prefix()match_results::suffix() は、正規表現による検索結果を柔軟に扱うための便利な関数です。prefix() はマッチ位置より前の部分文字列を、suffix() はマッチ位置より後ろの部分文字列を、いずれも引数なしで取得できます。これらの関数を安全に呼び出すには、regex_search() などによるマッチ処理が事前に実行され、結果が有効(ready() == true)であることを確認しておくことが重要です。

  1. C++の前置演算子(++i)と後置演算子(i++)の違いを徹底解説

    C++のインクリメント演算子には、前置(プレフィックス)形式と後置(ポストフィックス)形式の2種類があります。どちらも変数の値を1つ増やしますが、式として返す値が異なるため、この違いを正しく理解することが重要です。 前置演算子(++i)の動作 前置形式(++i)では、まず変数iの値がインクリメントされ、式の値としては「インクリメント後の新しい値」が返されます。つまり、「先に値を増やし、その結果を式に渡す」という順序で処理が行われます。 後置演算子(i++)の動作 一方、後置形式(i++)では、変数i自体はインクリメントされますが、式の値としては「インクリメント前の元の値」が返されます。つま

  2. Pythonで文字列の接頭辞・接尾辞が回文かどうかを判定する方法

    文字列 s が与えられたとき、その文字列の接頭辞(プレフィックス)および接尾辞(サフィックス)となる部分文字列が回文になっているかどうかを判定します。 たとえば、入力が s = levelishighforracecar の場合、接頭辞に「level」、接尾辞に「racecar」という回文がそれぞれ存在するため、出力は True になります。 解決の手順 この問題は、以下の手順で解くことができます。 l に文字列 s の長さを代入します。 i を 2 から l まで繰り返します。先頭からインデックス i までの部分文字列が回文であれば、ループを抜けます。 回文となる接頭辞が見つからなかった場