BOOST / tokenizer会忽略连续的分隔符

时间:2014-03-11 12:43:17

标签: c++ boost

我正在使用BOOST / tokenizer来分割字符串。 它适用于像#34; 1,2,3"这样的字符串,但是当有两个或多个连续的分隔符时,例如" 1,,3,4",它会返回" ; 1"," 3"," 4"。

有没有办法让tokenizer返回一个空字符串""而不是跳过它?

2 个答案:

答案 0 :(得分:6)

Boost.Tokenizer的char_separator类提供输出空标记或跳过其empty_tokens参数的选项。它默认为boost::drop_empty_tokens,与strtok()的行为相匹配,但可以通过提供boost::keep_empty_tokens来告知输出空标记。

例如,使用以下程序:

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/tokenizer.hpp>

int main()
{
  std::string str = "1,,3,4";
  typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
  boost::char_separator<char> sep(
      ",", // dropped delimiters
      "",  // keep delimiters
      boost::keep_empty_tokens); // empty token policy

  BOOST_FOREACH(std::string token, tokenizer(str, sep))
  {
    std::cout << "<" << token << "> ";
  }
  std::cout << std::endl;
}

输出结果为:

<1> <> <3> <4> 

答案 1 :(得分:4)

我认为您使用了以下分割功能

string text = "1,,3,4";
list<string> tokenList;
split(tokenList, text, is_any_of(","));
BOOST_FOREACH(string t, tokenList)
{
  cout << t << "." << endl;
}

如果您仔细阅读拆分原型here 你会注意到最后的默认参数!

所以现在在你的通话中使用明确的token_compress_off作为最后一个参数,它就没问题。

split(tokenList, text, is_any_of(","), token_compress_off);