2015-08-28 136 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