2015-08-28 85 views
2

我希望能够将一个字符串分为两部分,leftright,首次出现separator。例如,使用#作为分隔符left#right#more将导致leftright#more使用C++ Boost将字符串拆分为两部分?

我必须这样做的方法:

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)。

有什么建议吗?

+0

您可能会受到[提案](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3510.html)和[this](http:// stackoverflow.com/questions/5734304/c-boost-split-string)。 –

回答

5

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

尽管如此,这里是基于精神的样本:

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

感谢您的提示!不知道我明白它是如何工作的,但这只是说我读起来很有趣。 :-)至少我可以说它(a)有效,而(b)是更少的代码行。 – Anders

+0

是的。精神不是“看不见”的东西。尽管这在概念上很简单。你应该到那里阅读教程介绍。事实上,我从一开始就以“我预测它不会更好”为理由。我亲自写了你的东西。 – sehe