スライドショー

【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関数の詳しい使い方はこちらの記事で解説しているので、ぜひ確認してください。

【C++入門】文字列を検索するfind関数(全検索、正規表現)
更新日 : 2019年4月13日

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

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

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

#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 engineer\nninja 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 engineer\nninja 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関数を使うことで文字列を他の文字列に置き換えることができます。

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

MoritaIssei

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説