C++ で文字列をトリムする方法

この記事では、C++ で文字列をトリミングする方法を説明します。

文字列のトリミング関数を実装するには erase(), find_first_not_of(), find_last_not_of() メソッドを使用する

標準の C++ ライブラリには文字列トリミングのための関数が含まれていないので、自分で実装するか、Boost のような外部ライブラリを利用する必要があります(文字列アルゴリズム参照)。

以下の例では、2つの組み込みの std::string メソッドを用いてカスタム関数を構築する方法を示します。まず、引数として渡された文字を文字列の左側から切り取る leftTrim 関数を実装する。トリムする文字は ., ,, /, 空白を任意に指定している。

leftTrim 関数は find_first_not_of メソッドを呼び出して、引数に含まれる char-s と一致しない最初の文字を探し、その位置を返します。そして erase メソッドは先頭から見つかった位置までの文字の範囲を削除します。

#include <iostream>
#include <string>

using std::cout; using std::cin;
using std::endl; using std::string;

string& leftTrim(string& str, string& chars)
{
    str.erase(0, str.find_first_not_of(chars));
    return str;
}

int main(){
    string chars_to_trim = ".,/ ";
    string text = ",.,  C++ Standard";

    cout << text << endl;
    leftTrim(text, chars_to_trim);
    cout << text << endl;

    return EXIT_SUCCESS;
}

出力:

,.,  C++ Standard
C++ Standard

あるいは、trimLeft 関数を元に戻して、文字列の右側から与えられた文字をトリミングすることもできます。この場合は find_last_not_of メソッドを利用します。これに対応して、erase メソッドは found position + 1 パラメータを指定して呼び出されます。

これらの関数はどちらもその場で文字列を操作していることに注意してください。

#include <iostream>
#include <string>

using std::cout; using std::cin;
using std::endl; using std::string;

string& rightTrim(string& str, string& chars)
{
    str.erase(str.find_last_not_of(chars) + 1);
    return str;
}

int main(){
    string chars_to_trim = ".,/ ";
    string text = "C++ Standard /././";

    cout << text << endl;
    rightTrim(text, chars_to_trim);
    cout << text << endl;

    return EXIT_SUCCESS;
}

出力:

C++ Standard /././
C++ Standard

最後に、前の関数を組み合わせて trimString 関数を実装することができます。この関数は左右のバージョンと同じパラメータを持っています。trimStringrigthTrim 関数の結果を引数に渡すことで leftTrim を呼び出します。これらの関数呼び出しの場所を入れ替えても、プログラムの正しさを変えることはありません。

#include <iostream>
#include <string>

using std::cout; using std::cin;
using std::endl; using std::string;

string& leftTrim(string& str, string& chars)
{
    str.erase(0, str.find_first_not_of(chars));
    return str;
}

string& rightTrim(string& str, string& chars)
{
    str.erase(str.find_last_not_of(chars) + 1);
    return str;
}

string& trimString(string& str, string& chars)
{
    return leftTrim(rightTrim(str, chars), chars);
}

int main(){
    string chars_to_trim = ".,/ ";
    string text = ",,, ..    C++ Standard  ...";

    cout << text << endl;
    trimString(text, chars_to_trim);
    cout << text << endl;

    return EXIT_SUCCESS;
}
,,, ..    C++ Standard  ...
C++ Standard

関連記事 - C++ String

  • C++で文字列の中の部分文字列を検索する方法
  • C++ でデリミタを使用して文字列を解析する方法
  • comments powered by Disqus