c++将字符串拆分为另一个字符串作为整体

C++ split string by another string as whole

本文关键字:字符串 另一个 拆分 c++      更新时间:2023-10-16

我想按出现and的任意次数分割字符串。

首先,我必须说清楚,我不打算使用任何regex作为分隔符。

我运行以下代码:

#include <iostream>
#include <regex>
#include <boost/algorithm/string.hpp>
int main()
{
    std::vector<std::string> results;
    std::string text=
        "Alexievich, Svetlana and Lindahl,Tomas and Campbell,William";
    boost::split(
        results,
        text,
        boost::is_any_of(" and "),
        boost::token_compress_off
        );
    for(auto result:results)
    {
        std::cout<<result<<"n";
    }
    return 0;
}

,结果与我期望的不同:

Alexievich,
Svetl



Li

hl,Tom
s


C
mpbell,Willi
m

分隔符中的每个字符似乎都单独起作用,而我需要将整个and作为分隔符。

请不要链接到这个boost示例,除非你确定它将适用于我的情况

<algorithm>包含此任务的搜索权限工具。

vector<string> results;
const string text{ "Alexievich, Svetlana and Lindahl,Tomas and Campbell,William" };
const string delim{ " and " };
for (auto p = cbegin(text); p != cend(text); ) {
    const auto n = search(p, cend(text), cbegin(delim), cend(delim));
    results.emplace_back(p, n);
    p = n;
    if (cend(text) != n) // we found delim, skip over it.
        p += delim.length();
}

老办法:

#include <iostream>
#include <string>
#include <vector>
int main()
{
    std::vector<std::string> results;
    std::string text=
        "Alexievich, Svetlana and Lindahl,Tomas and Campbell,William";
    size_t pos = 0;
    for (;;) {
        size_t next = text.find("and", pos);
        results.push_back(text.substr(pos, next - pos));
        if (next == std::string::npos) break;
        pos = next + 3;
    }
    for(auto result:results)
    {
        std::cout<<result<<"n";
    }
    return 0;
}

打包成一个可重用的函数留给读者作为练习。

相关文章: