1. ホーム
  2. c++

[解決済み】C++で文字列区切り文字を使ったパース(分割)(標準C++)について)

2022-03-23 22:38:41

質問

C++で以下のように文字列をパースしています。

using namespace std;

string parsed,input="text to be parsed";
stringstream input_stringstream(input);

if (getline(input_stringstream,parsed,' '))
{
     // do some processing.
}

1文字のデリミタでパースするのは問題ありません。しかし、文字列をデリミターとして使いたい場合はどうすればよいのでしょうか。

例 分割したい。

scott>=tiger

>= をデリミタとして、scottとtigerを取得できるようにしました。

どのように解決するのですか?

を使用することができます。 std::string::find() 関数を使って文字列の区切り文字の位置を調べ、次に std::string::substr() でトークンを取得します。

std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"

  • find(const string& str, size_t pos = 0) の最初の出現位置を返します。 str 文字列の中で、または npos 文字列が見つからない場合

  • substr(size_t pos = 0, size_t n = npos) 関数は、オブジェクトの部分文字列を返します。 pos で、長さが npos .


複数のデリミタがある場合、あるトークンを抽出した後、それを(デリミタを含めて)削除することで以降の抽出を進めることができます(元の文字列を保持したい場合は、単に s = s.substr(pos + delimiter.length()); ):

s.erase(0, s.find(delimiter) + delimiter.length());

こうすることで、各トークンを取得するためのループを簡単に作ることができます。

完全な例

std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";

size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
    token = s.substr(0, pos);
    std::cout << token << std::endl;
    s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;

出力します。

scott
tiger
mushroom