我如何以簡單的方式基於另一個子串分割字符串?在子串上拆分
例如分裂的 「\ r \ n」 個
message1\r\nmessage2
=>
message1
message2
從我已經能夠找到雙方的boost ::標記生成器和boost ::分裂只能對單個字符。
編輯:
我知道,我可以使用的std :: string ::查找和的std :: string :: SUBSTR和有一個循環等做到這一點......但是那不是我的意思通過「簡單」。
我如何以簡單的方式基於另一個子串分割字符串?在子串上拆分
例如分裂的 「\ r \ n」 個
message1\r\nmessage2
=>
message1
message2
從我已經能夠找到雙方的boost ::標記生成器和boost ::分裂只能對單個字符。
編輯:
我知道,我可以使用的std :: string ::查找和的std :: string :: SUBSTR和有一個循環等做到這一點......但是那不是我的意思通過「簡單」。
雖然升壓::拆分確實發生,關於字符操作謂詞,有一個升壓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';
}
您可以搜索下一次出現的用作分割標記的子字符串。這樣的方法可能會返回下一個發生的索引,並讓您可以自己拆分字符串。
這是一個巨大的依賴,但我個人喜歡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";
}
}
這僅適用於單字符分隔符(或以任何順序組合單個字符分隔符的分隔符),OP會詢問用作分隔符的子字符串。 – Cubbi 2010-09-17 23:08:00
@Cubbi:你在給定的例子中是正確的,但是你可以提供一個自定義的標記器,它在子字符串上分開。 – ybungalobill 2011-06-07 21:23:21
由於只要它涉及空白:
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);
}
+1,確保..我可以做一個str.find,然後串等..但是那不是我定義爲一個簡單的方法。 – ronag 2010-09-17 22:01:09