c++ - 使用 C++ Boost 将字符串分成两部分?

标签 c++ string boost split

我希望能够在第一次出现分隔符时将字符串分成两部分,。例如,使用 # 作为分隔符 left#right#more 将导致 leftright#more

我有一个方法可以做到这一点:

void misc::split(const string &input, string &left, string &right, char separator)
{
    int index = input.find(separator);
    if (index == string::npos)
    {
        left = input;
        right.erase();
    }
    else
    {
        right = input.substr(index + 1);
        left = input.substr(0, index);
    }
}

现在我已经开始使用 Boost 并希望将这段相当冗长的代码压缩为更优雅的东西。我了解 boost::split(),但这在初始示例中为我提供了三个部分(leftrightmore )。

有什么建议吗?

最佳答案

我预测它不会明显更好,因为如果内在复杂性。

尽管如此,这里有一个基于 spirit 的示例:

static void split(const std::string &input, std::string &left, std::string &right, char separator)
{
    using namespace boost::spirit::qi;

    parse(input.begin(), input.end(), *~char_(separator) >> separator >> *char_, left, right);
}

经过全面测试:

Live On Coliru

#include <boost/spirit/include/qi.hpp>

struct misc {
    static void split(const std::string &input, std::string &left, std::string &right, char separator)
    {
        using namespace boost::spirit::qi;

        parse(input.begin(), input.end(), *~char_(separator) >> separator >> *char_, left, right);
    }
};

int main() {
    for (std::string s : {
            "",
            "a",
            "a;",
            "a;b",
            ";b",
            ";",
            "a;b;",
            ";;" })
    {
        std::string l,r;
        misc::split(s,l,r,';');
        std::cout << "'" << s << "'\t-> l:'" << l << "'\tr:'" << r << "'\n";
    }
}

打印:

''  -> l:'' r:''
'a' -> l:'a'    r:''
'a;'    -> l:'a'    r:''
'a;b'   -> l:'a'    r:'b'
';b'    -> l:'' r:'b'
';' -> l:'' r:''
'a;b;'  -> l:'a'    r:'b;'
';;'    -> l:'' r:';'

关于c++ - 使用 C++ Boost 将字符串分成两部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32270563/

相关文章:

c++ - 删除存储在 std::vector 中的对象

c++ - 菜单栏上添加了qt按钮

vb.net - 在 VB.Net 中定义字符串 ENUM

python - 从嵌套字典中删除键(Python 键)

c++ - boost:如何监视互斥体的状态并在死锁时强制释放

c++ - 将整数隐式转换为类 'BigInt'

c++ - std::getline(std::cin, string) 可能因键盘输入而失败的方式

python - __sizeof__ str 大于 __sizeof__ 包含该字符串的元组

c++ - 指向函数指针返回的对象实例的函数指针

c++ - 编译 boost spirit 解析器时出现奇怪的 static_cast 编译错误