2010-09-17 53 views
7

我如何以簡單的方式基於另一個子串分割字符串?在子串上拆分

例如分裂的 「\ r \ n」 個

message1\r\nmessage2 

=>

message1 
message2 

從我已經能夠找到雙方的boost ::標記生成器和boost ::分裂只能對單個字符。

編輯:

我知道,我可以使用的std :: string ::查找和的std :: string :: SUBSTR和有一個循環等做到這一點......但是那不是我的意思通過「簡單」。

回答

16

雖然升壓::拆分確實發生,關於字符操作謂詞,有一個升壓string algorithm可以在子拆分:

#include <string> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 
#include <boost/algorithm/string/iter_find.hpp> 
#include <boost/algorithm/string/finder.hpp> 
int main() 
{ 
    std::string input = "message1foomessage2foomessage3"; 

    std::vector<std::string> v; 
    iter_split(v, input, boost::algorithm::first_finder("foo")); 

    copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, " ")); 
    std::cout << '\n'; 
} 
1

您可以搜索下一次出現的用作分割標記的子字符串。這樣的方法可能會返回下一個發生的索引,並讓您可以自己拆分字符串。

+1

+1,確保..我可以做一個str.find,然後串等..但是那不是我定義爲一個簡單的方法。 – ronag 2010-09-17 22:01:09

0

這是一個巨大的依賴,但我個人喜歡Boost::Tokenizer

從頁面上的例子:

// simple_example_1.cpp 
#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "This is, a test"; 
    tokenizer<> tok(s); 
    for(tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 
+1

這僅適用於單字符分隔符(或以任何順序組合單個字符分隔符的分隔符),OP會詢問用作分隔符的子字符串。 – Cubbi 2010-09-17 23:08:00

+0

@Cubbi:你在給定的例子中是正確的,但是你可以提供一個自定義的標記器,它在子字符串上分開。 – ybungalobill 2011-06-07 21:23:21

-1

由於只要它涉及空白:

string s("somethin\nsomethingElse"); 
strinstream ss(s); 
string line; 
vector<string> lines; 
while(ss >> line) 
{ 
    lines.push_back(line); 
} 

或者,使用getline(),它允許您指定令牌化字符作爲可選的第三個參數:

string s("Something\n\rOr\n\rOther"); 
stringstream ss(s); 
vector<string> lines; 
string line; 
while(getline(ss,line)) 
{ 
    lines.push_back(line); 
}