C++ プログラミング

C++ で文字列中の “A” を “B” に正規表現で置換する方法

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書式付きフォーマットに展開

-C++, プログラミング

Copyright© donguri.pyのblog , 2025 All Rights Reserved.