C++で「Python」を「C++」に正規表現で置換する基本例
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
getline(cin, s);
regex pattern("Python");
string ans = regex_replace(s, pattern, "C++");
cout << ans << endl;
}
getline(cin, s)
により1行の入力を取得regex pattern("Python")
で単純に文字列"Python"
にマッチregex_replace(s, pattern, "C++")
により入力中の全"Python"
を"C++"
に置換し、新たな文字列を返します
🔧 応用パターンの紹介
1. 大文字小文字を無視した置換(case-insensitive)
regex pattern("Python", regex_constants::icase);
このように icase
フラグを使えば "python"
や "PYTHON"
も置換対象になります。
string ans = regex_replace(s, pattern, "C++");
2. キャプチャグループを使った再利用・部分置換
● 一部を含めて置換
regex pattern(R"((Python)(\s*3))");
string ans = regex_replace(s, pattern, "$1 4");
→ "Python3"
を "Python 4"
に置換(スペース付き)。
● 番号付き参照を使った形式の書き換え
以下のような複雑な置換も可能:
regex re{R"((-)(\d+))"};
string result = regex_replace("balance -100", re, "($2)");
→ -100
を (100)
に書き換えます。
3. 特殊トークンによる置換の拡張
$0
,$&
:マッチ全体を参照$1
〜$9
:対応するキャプチャグループを参照- `$``(バックティック):マッチ前の文字列
$'
(クォート):マッチ後の文字列
例:
regex re(R"(.*?(happy|hungry) (brown|black) (bear|cat).*?)");
string replace = "Matched: $&\n Mood: $1\n Color: $2\n Animal: $3\n";
複数マッチをフォーマット付きで展開できます。
4. 書き込みイテレータ&フラグ活用
● 出力をストリームに直接書き込み
regex re(R"(\s+)");
regex_replace(ostreambuf_iterator<char>(cout),
s.begin(), s.end(), re, " ");
→ スペース1つにまとめるトリム処理として使えます。
● フラグによる出力制御
regex_constants::format_first_only // 最初だけを置換
regex_constants::format_no_copy // マッチしない部分をコピーしない
これらのフラグにより細かな制御が可能です。
5. 大規模テキストでのパフォーマンス注意点
std::regex
は速度やメモリ使用の点でやや重い傾向があります。多量データ処理やループ内部では Boost.Regex などの代替を検討する価値があります。
✅ 実行例まとめ
入力 | 出力 |
---|---|
I love Python and python (icase) | I love C++ and C++ |
he-happy-bear and she-hungry-cat | 書式付きフォーマットに展開 |