【C++入門】replace関数で文字列を置換する方法(正規表現、全置換)

C++では、文字列の一部を他の文字列に置換するreplace関数が用意されています。またreplace関数を使うことで、文字列の部分文字列を他の文字列に置換することもできます。

今回は、

  • replace関数とは
  • 文字列の一部を置換する方法
  • 文字列を全て置換する方法
  • 正規表現を 使って全て置き換える方法
  • 正規表現を使って一部のみ置き換える方法

という基本的な内容から、応用的な内容まで解説します。

目次

replace関数とは

replace関数を使うことで、文字列の一部を他の文字列に置換することができます

この記事では、これを使って文字列から特定の文字列を他の文字列に置き換える方法についても解説します。

replace関数の使い方

replace関数は引数の取り方がいくつかあります。

std::string str;

str.replace(開始位置, 長さ, 文字列);
str.replace(開始位置, 長さ, 文字列, 部分文字列の開始位置, 部分文字列の長さ);
str.replace(開始位置, 長さ, 文字の繰り返し回数, 文字);

今回は使用していませんが、イテレータについて以下のように使うこともできます。

std::string str;

str.replace(開始位置のイテレータ, 終了位置のイテレータ, 文字列);
str.replace(開始位置のイテレータ, 終了位置のイテレータ, 文字列, 部分文字列の開始位置, 部分文字列の長さ);
str.replace(開始位置のイテレータ, 終了位置のイテレータ, 文字の繰り返し回数, 文字);

次のプログラムで確認してみましょう。

#include <iostream>
#include <string>

int main() {
    std::string str = "samurai engineer!";

    std::cout << "置換前:" << str << std::endl;

    str.replace(8, 8, "programmer");

    std::cout << "置換後:" << str << std::endl;

    return 0;
}

実行結果:

置換前:samurai engineer!
置換後:samurai programmer!

文字列を置換する方法

replace関数では開始位置と長さをもとに他の文字列に置換することができます。

では、replace関数を使い、文字列の中の特定の文字列を他の文字列に置き換えたいときにはどうすればいいのでしょうか?

文字列の一部を置き換える方法

文字列の中から特定の文字列を他の文字列に置き換えるためには、まずその特定の文字列がどこに現れるのかを調べる必要があります。

そしてその文字列の位置を他の文字列に置き換えることでできます。find関数を使い、文字列がどこに現れるのかを調べることができます。

次のプログラムで確認してみましょう。

#include <iostream>
#include <string>

std::string replaceOtherStr(std::string &replacedStr, std::string from, std::string to) {
    const unsigned int pos = replacedStr.find(from);
    const int len = from.length();

    if (pos == std::string::npos || from.empty()) {
        return replacedStr;
    }

    return replacedStr.replace(pos, len, to);
}

int main() {
    std::string str = "samurai engineer!";

    std::cout << "置換前:" << str << std::endl;

    replaceOtherStr(str, "engineer", "programmer");

    std::cout << "置換後:" << str << std::endl;

    return 0;
}

実行結果:

置換前:samurai engineer!
置換後:samurai programmer!

find関数の詳しい使い方はこちらの記事で解説しているので、ぜひ確認してください。

文字列を全て置き換える方法

文字列が現れる場所を全て調べていき、見つかった場所を他の文字列に置き換えることで、文字列に存在する特定の文字列を全て置き換えることができます。

次のプログラムで確認してみましょう。

#include <iostream>
#include <string>

std::string replaceAll(std::string &replacedStr, std::string from, std::string to) {
    unsigned int pos = replacedStr.find(from);
    int toLen = to.length();

    if (from.empty()) {
        return replacedStr;
    }

    while ((pos = replacedStr.find(from, pos)) != std::string::npos) {
        replacedStr.replace(pos, from.length(), to);
        pos += toLen;
    }
    return replacedStr;
}

int main() {
    std::string str = "samurai, engineer, ninja, se, engineer!";

    std::cout << "置換前:" << str << std::endl;

    replaceAll(str, "engineer", "programmer");

    std::cout << "置換後:" << str << std::endl;

    return 0;
}

実行結果:

置換前:samurai, engineer, ninja, se, engineer!
置換後:samurai, programmer, ninja, se, programmer!

正規表現で置換する方法

正規表現を使うことで、文字列の置換が行いやすくなります。正規表現の詳しい使い方はこちらの記事で解説しているので、ぜひ確認してください。

正規表現を使って全て置き換える方法

regex_replace関数を使うことで、文字列を正規表現を使って他の文字列に置き換えた結果を取得することができます。

regex_replace関数を使うには、regexというライブラリをインクルードする必要があります。regex_replace関数は以下のように引数をとります。

std::regex_replace(文字列, 正規表現, 置き換える文字列);

置き換える文字列には、「$」を使うことで一致した文字列を利用することができます。

例えば、以下のような正規表現の文字列について

std::string s ("samurai juku");
std::regex e ("(w+) (w+)"); 
std::regex_replace (s, e,"$2 $1");

とすると「w+」でアルファベットや数字を使った単語にマッチし、$2にはsamurai、$1にはjukuが入り、二つを入れ替えることができます。

次のプログラムで確認してみましょう。

#include <iostream>
#include <string>
#include <regex>

int main() {
    std::string str = "samurai engineernninja se ";
    std::regex re("(w+) (w+)");
    std::string format = "$2 $1";

    std::cout << "置換前:" << str << std::endl;

    std::cout << "置換後:" << std::regex_replace(str, re, format) << std::endl;

    return 0;
}

実行結果:

置換前:samurai engineer
ninja se 
置換後:engineer samurai
se ninja

正規表現を使って一部のみ置き換える方法

regex_replace関数は、フラグを設定することができます。

今回は、std::regex_constants::format_first_onlyというフラグを使って、最初の一致したところのみ置き換えてみます。次のプログラムで確認してみましょう。

#include <iostream>
#include <string>
#include <regex>

int main() {
    std::string str = "samurai engineernninja se ";
    std::regex re("(w+) (w+)");
    std::string format = "$2 $1";

    std::cout << "置換前:" << str << std::endl;

    std::cout << "置換後:" << std::regex_replace(str, re, format, std::regex_constants::format_first_only) << std::endl;

    return 0;
}

実行結果:

置換前:samurai engineer
ninja se 
置換後:engineer samurai
ninja se

まとめ

いかがだったでしょうか?

今回はreplace関数とregex_replaceの使い方を解説しました。replace関数を使うことで文字列を他の文字列に置き換えることができます。

もし、文字列を置換する方法を忘れてしまったらこの記事を確認してください。

この記事を書いた人

ご閲覧いただきありがとうございます。森田一世と申します。プログラマーとしてRaspberry piを使ったり、記事を作成しています。

目次