繁体   English   中英

使用C ++ Boost将字符串分为两部分吗?

[英]Split string in two parts using C++ Boost?

我希望能够将字符串分割成两个部分, leftright ,在第一次出现separator 例如,使用#作为分隔符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 )。

有什么建议么?

我预测它不会好得多,因为如果具有内在复杂性。

不过,这是一个基于精神的示例:

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);
}

经过全面测试:

生活在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:';'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM