C ++中的字符串标记生成器,允许多个分隔符

有没有办法在C ++中用多个分隔符标记字符串? 在C#中我会做到:

string[] tokens = "adsl, dkks; dk".Split(new [] { ",", " ", ";" }, StringSplitOptions.RemoveEmpty); 

使用boost :: tokenizer。 它支持多个分隔符。

实际上,你甚至不需要boost :: tokenizer。 如果您只想要拆分,请使用boost :: split。 该文档有一个例子: http : //www.boost.org/doc/libs/1_42_0/doc/html/string_algo/usage.html#id1718906

这样的事情会做:

 void tokenize_string(const std::string &original_string, const std::string &delimiters, std::vector *tokens) { if (NULL == tokens) return; size_t pos_start = original_string.find_first_not_of(delimiters); size_t pos_end = original_string.find_first_of(delimiters, pos_start); while (std::string::npos != pos_start) { tokens->push_back(original_string.substr(pos_start, pos_end - pos_start)); pos_start = original_string.find_first_not_of(delimiters, pos_end); pos_end = original_string.find_first_of(delimiters, pos_start); } } 

这是我的版本(未经过严格测试(尚未)):

 std::vector split(std::string const& s, std::vector const& delims) { std::vector parts; std::vector> poss; poss.reserve(delims.size()); std::string::size_type beg = 0; for(;;) { poss.clear(); std::string::size_type idx = 0; for(auto const& delim: delims) { if(auto end = s.find(delim, beg) + 1) poss.emplace_back(end - 1, idx); ++idx; } if(poss.empty()) break; std::sort(std::begin(poss), std::end(poss)); auto old_beg = beg; for(auto pos: poss) { parts.emplace_back(std::begin(s) + beg, std::begin(s) + old_beg + pos.first); beg = pos.first + delims[pos.second].size(); } } if(beg < s.size()) parts.emplace_back(std::begin(s) + beg, std::end(s)); return parts; }