我正在使用BOOST / tokenizer来分割字符串。 它适用于像#34; 1,2,3"这样的字符串,但是当有两个或多个连续的分隔符时,例如" 1,,3,4",它会返回" ; 1"," 3"," 4"。
有没有办法让tokenizer返回一个空字符串""而不是跳过它?
答案 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);