假設我有串狀分割字符串分隔符
Harry potter was written by J. K. Rowling
如何使用was
和by
作爲分隔符分割字符串,並獲得導致C++載體?
我知道分裂使用多個字符,但不使用多個字符串。
假設我有串狀分割字符串分隔符
Harry potter was written by J. K. Rowling
如何使用was
和by
作爲分隔符分割字符串,並獲得導致C++載體?
我知道分裂使用多個字符,但不使用多個字符串。
如果使用C++ 11和鏗鏘有使用正則表達式字符串標記的解決方案:
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
int main()
{
std::string text = " Harry potter was written by J. K. Rowling.";
std::regex ws_re("(was)|(by)");
std::copy(std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
輸出是:
Harry potter
written
J. K. Rowling.
可悲的是gcc4.8沒有正則表達式完全集成。但鏗鏘編譯並正確鏈接。
暴力方法,而不是推動,沒有C++ 11,優化多人歡迎:
/** Split the string s by the delimiters, place the result in the
outgoing vector result */
void split(const std::string& s, const std::vector<std::string>& delims,
std::vector<std::string>& result)
{
// split the string into words
std::stringstream ss(s);
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> splits(begin, end);
// then append the words together, except if they are delimiter
std::string current;
for(int i=0; i<splits.size(); i++)
{
if(std::find(delims.begin(), delims.end(), splits[i]) != delims.end())
{
result.push_back(current);
current = "";
}
else
{
current += splits[i] + " " ;
}
}
result.push_back(current.substr(0, current.size() - 1));
}
怎麼樣的正則表達式記號迭代?:http://en.cppreference.com/w/cpp/正則表達式/ regex_token_iterator – tgmath
我想盡可能不使用正則表達式,直到它可能,但正則表達式的答案,如果可能的給出的例子也將是有益的。 – psyche