【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)であることを確認しておくことが重要です。
-
C++の前置演算子(++i)と後置演算子(i++)の違いを徹底解説
C++のインクリメント演算子には、前置(プレフィックス)形式と後置(ポストフィックス)形式の2種類があります。どちらも変数の値を1つ増やしますが、式として返す値が異なるため、この違いを正しく理解することが重要です。 前置演算子(++i)の動作 前置形式(++i)では、まず変数iの値がインクリメントされ、式の値としては「インクリメント後の新しい値」が返されます。つまり、「先に値を増やし、その結果を式に渡す」という順序で処理が行われます。 後置演算子(i++)の動作 一方、後置形式(i++)では、変数i自体はインクリメントされますが、式の値としては「インクリメント前の元の値」が返されます。つま
-
Pythonで文字列の接頭辞・接尾辞が回文かどうかを判定する方法
文字列 s が与えられたとき、その文字列の接頭辞(プレフィックス)および接尾辞(サフィックス)となる部分文字列が回文になっているかどうかを判定します。 たとえば、入力が s = levelishighforracecar の場合、接頭辞に「level」、接尾辞に「racecar」という回文がそれぞれ存在するため、出力は True になります。 解決の手順 この問題は、以下の手順で解くことができます。 l に文字列 s の長さを代入します。 i を 2 から l まで繰り返します。先頭からインデックス i までの部分文字列が回文であれば、ループを抜けます。 回文となる接頭辞が見つからなかった場