正規表現にマッチした全ての文字列を置換する方法と、最初にマッチした文字列のみを置き換える方法を解説します。
目次
- マッチした全ての文字列を置換(regex_replace関数)(replaceAll, gsub, グローバルサーチに相当)
- 最初にマッチした文字列を置換(format_first_onlyフラグ)(replaceFirst, sub に相当)
マッチした全ての文字列を置換(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"