C++ 正規表現で文字列の置換/全置換【std::regex_replace, replace_first/replace_all/gsub】

正規表現にマッチした全ての文字列を置換する方法と、最初にマッチした文字列のみを置き換える方法を解説します。

目次

マッチした全ての文字列を置換(regex_replace関数)

regexヘッダーのstd::regex_replace関数を用いることで、正規表現による置き換えが実現できます。置換の対象は正規表現のパターンに一致した全ての箇所です。

// #include <regex>
// regex_replace(target, pattern, replacement)

std::string r = std::regex_replace("Shop99", std::regex("\\d"), "Q");
r; // "ShopQQ"

第一引数には検索先の文字列を指定します。第二引数には正規表現のパターンをstd::regexオブジェクト形式で指定し、第三引数にはマッチした場合に置き換えたい文字列を指定します。戻り値には、置き換え後の文字列がstd::string型(basic_string)の値として返されます。

スクリプト言語におけるグローバルサーチの処理に相当します("ab".replace(/./g, '-'))。

サブマッチとキャプチャ

()によるキャプチャリングと$1によるサブマッチを活用した置き換えも可能です。

auto r = std::regex_replace("Shop99", std::regex("(\\d+)"), " $1");
r; // "Shop 99"

r = std::regex_replace("Shop99", std::regex("(\\D+)(\\d+)"), "$0 = $1 + $2");
r; // "Shop99 = Shop + 99"

$0はマッチした全体の文字列を表します。$1, $2, $n, ...はキャプチャされた各サブマッチの文字列を表します。

イテレータによる置換

イテレータを用いた置き換えも可能です。そのためstd::vector等のコンテナに対する検索や置換も可能です。

std::string r, s = "Shop99";
std::regex_replace(std::back_inserter(r), s.begin(), s.end(), std::regex("\\d"), "Q");
r; // "ShopQQ"
std::regex_replace(r.begin(), s.begin(), s.begin() + 4, std::regex("\\w"), "-");
r; // "----QQ"

最初にマッチした文字列を置換(format_first_onlyフラグ)

最初に一致したパターンのみを置き換え対象にしたい場合には、先程紹介したstd::regex_replace関数の第四引数にstd::regex_constants::format_first_onlyフラグを指定します。

// #include <regex>
// regex_replace(s, pt, rep, flags: std::regex_constants::match_flag_type)

auto r = std::regex_replace("Shop99", std::regex("\\d"), "Q", std::regex_constants::format_first_only);
r; // "ShopQ9"
広告