【问题标题】:Split string in two parts using C++ Boost?使用 C++ Boost 将字符串分成两部分?
【发布时间】:2015-08-28 12:00:01
【问题描述】:

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

有什么建议吗?

【问题讨论】:

标签: c++ string boost split


【解决方案1】:

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

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

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:';'

【讨论】:

  • 感谢您的提示!不确定我是否理解它是如何工作的,但这只是意味着我有一些有趣的阅读要做。 :-) 至少我可以看出它 (a) 有效,并且 (b) 代码行数更少。
  • 是的。精神不是“一见钟情”的东西。虽然它在概念上很简单。您应该只阅读教程介绍。事实上,我从“我预测它不会明显好转”开始是有原因的。我会亲自写下你所拥有的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多