std::stringのreplace関数を使うと指定した位置の文字列を置換することはできるけど、特定の文字列を置換することはできません。
今回は、特定の文字列を検索するfind関数とreplace関数を組み合わせて特定の文字列を別の文字列に置換する関数を作ります。
replaceメンバ関数について
std::stringのreplaceメンバ関数は、指定した位置から指定した文字数分を指定した文字列に置換する関数です。
string.replace(開始位置, 長さ, 置換文字列)
string.replace(開始位置, 長さ, 繰返し回数, 文字)
上記の様に、第一引数に置き換える開始位置、第二引数に置き換えたい長さ、第三引数に新たな文字列を指定します。置換文字が文字列ではなく文字型(char型)の場合は、第三引数に文字の繰返し回数、第四引数に置換文字を指定します。
注意
replaceメンバ関数は、自分自身の値を変更するので注意が必要です。
指定の文字列を置換する関数(先頭の1つのみ置換)
文字列中に出てきた指定の文字列(一番最初に出てきたもののみ)を置換する関数です。
void Replace(std::string& stringreplace, const std::string& origin, const std::string& dest)
{
size_t pos = stringreplace.find(origin); // 置換したい文字列が登場する位置を検索する
size_t len = origin.length(); // 置換したい文字列の長さ
stringreplace.replace(pos, len, dest); // 置換
}
replaceの引数は、置き換える開始位置・長さ・文字列を指定するので、関数の一行目で開始位置をfind関数で調べます。関数の二行目で置換したい文字列の長さを取得します。
使用方法と結果
void main()
{
std::string str = "string replace test test tes t ";
std::string old = "test";
std::string dst = "str";
std::cout << "Before: " << str << std::endl;
Replace(str, old, dst);
std::cout << "After : " << str << std::endl;
}
Before: string replace test test tes t
After : string replace str test tes t
指定の文字列を全て置換する関数
文字列中に出てきた指定文字列全てを置換する関数です。
void MainWindow::ReplaceAll(std::string& stringreplace, const std::string& origin, const std::string& dest)
{
size_t pos = 0;
size_t offset = 0;
size_t len = origin.length();
// 指定文字列が見つからなくなるまでループする
while ((pos = stringreplace.find(origin, offset)) != std::string::npos) {
stringreplace.replace(pos, len, dest);
offset = pos + dest.length();
}
}
一番最初に見つかった置換対象文字列を置換する関数と違うのは、置換対象文字列が見つからなくなるまで繰り返し置換をしている部分です。
使用方法と結果
void main()
{
std::string str = "string replace test test tes t ";
std::string old = "test";
std::string dst = "str";
std::cout << "Before: " << str << std::endl;
ReplaceAll(str, old, dst);
std::cout << "After : " << str << std::endl;
}
Before: string replace test test tes t
After : string replace str str tes t