
競プロなどで文字列の置換が必要な場合があります。C++では複数の方法がありますが、今回は正規表現を使った置換について書きたいと思います。
C++には、正規表現(regex)を使って文字列を検索・置換する機能が標準ライブラリで提供されています。本記事では、その中でも特に便利なregex_replace
関数を使って、指定したパターンを置換するサンプルコードを解説します。
📌 サンプルコード
まずはこちらのコードをご覧ください。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "ABCDEFGHIJKABC";
string ans = "XYZ";
regex reg{"ABC"};
string ret = regex_replace(s, reg, ans);
cout << ret << endl;
}
🔍 このコードでやっていること
このプログラムの目的は、文字列s
に含まれる特定のパターン"ABC"
をすべて"XYZ"
に置き換えることです。
1. #include <bits/stdc++.h>
で標準ライブラリを一括インクルード
#include <bits/stdc++.h>
このヘッダは、競技プログラミングなどでよく使われる「全ライブラリを一括で読み込む」マクロ的な存在です。regex
を含むほとんどの標準ライブラリがこの1行で使えるようになりますが、実務コードでは非推奨です。通常は<regex>
と必要なヘッダを明示的に書きましょう。
2. 対象の文字列s
を定義
string s = "ABCDEFGHIJKABC";
この文字列には2箇所に"ABC"
という部分文字列が含まれています。
3. 置換後の文字列ans
と、置換対象の正規表現reg
を定義
string ans = "XYZ";
regex reg{"ABC"};
ここでは、"ABC"
を検索し、見つかった箇所を"XYZ"
に置き換えるよう指定しています。
4. regex_replace
で置換実行
string ret = regex_replace(s, reg, ans);
この関数は、文字列s
の中からreg
に一致する部分をすべてans
で置換し、新しい文字列ret
を返します。
5. 出力
cout << ret << endl;
最終的に表示される出力は以下のとおりです:
XYZDEFGHIJKXYZ
最初と最後のABC
が、それぞれXYZ
に置換されていることが確認できます。
仮にABCという文字列が複数存在しても全て置換できています。
🧠 補足:正規表現を活用するメリット
C++のregex
は、単純な文字列の一致だけでなく、ワイルドカードや文字種の指定、繰り返しなど高度なパターンマッチが可能です。
たとえば:
regex reg{"A.C"}; // AとCの間に任意の1文字があるパターン
など、柔軟なパターン定義が可能です。
✅ まとめ
regex_replace
はC++で正規表現を使った置換処理を行うための便利な関数。- 簡単なパターンマッチだけでなく、複雑な文字列操作にも応用可能。
- 実際のプロダクションコードでは、
<bits/stdc++.h>
の代わりに必要なヘッダ(例:<regex>
)を明示するのがベター。
正規表現は一度慣れるととても強力なツールです。競プロでも、それ以外でも様々な場面で活躍します!!