boost::tokenizer 考虑分隔符之间没有标记
Posted
技术标签:
【中文标题】boost::tokenizer 考虑分隔符之间没有标记【英文标题】:boost::tokenizer to consider absence of tokens between separators 【发布时间】:2015-10-29 12:24:30 【问题描述】:我正在使用 boost::tokenizer 来获取 ';'从string
中分离字段。
我可以检索如下代码所示的字段,但我有 2 个问题:
-
tokenizer 是否提供任何函数来根据提供的分隔符了解字符串中的标记计数?
假设测试字符串有 3 个字段
a;b;c
。以下代码将打印所有这些。但我也需要打印空字段。例如。如果是字符串 a;;;b;c
,则令牌还应包含 nothing 作为第二个和第三个元素。或者换句话说,第二个和第三个标记应该是空的。
#include <boost/tokenizer.hpp>
namespace std;
namespace boost;
int main()
string data="a;;;;b;c";
boost::char_separator<char> obj(";");
boost::tokenizer<boost::char_separator<char> > tokens(data,obj);
cout<<endl<<tokens.countTokens();
for(boost::tokenizer<boost::char_separator<char> >::iterator it=tokens.begin();
it!=tokens.end();
++it)
std::cout<<*it<<endl;
【问题讨论】:
您的第二个问题在这里得到解答:***.com/questions/22331648/… 【参考方案1】:1) 你可以只计算结束和开始之间的差异。
const size_t count = std::distance(tokens.begin(), tokens.end());
2) 你应该正确构造分隔符。
boost::char_separator<char> obj(";", "", boost::keep_empty_tokens);
Live example
【讨论】:
谢谢。有效。我刚刚读到 space 默认情况下被视为分隔符。所以a;b; c;d
只会获取 a 和 b 因为它在 b;
之后遇到两个空格。无论如何我让标记器停止将空格视为标记分隔符?
我将第二个参数保留为“”。但它仍然无法正常工作。我是这样做的:boost::char_separator<char> obj(";"," ",boost::keep_empty_tokens);
@anurag86 看,在我的代码中没有空格,只有空字符串。
我的意思是我得到了 2 个问题的答案。我现在要问的是,如果我的字符串包含 ;
分隔字段,如果字段本身包含空格,那么标记器将 space 也视为分隔符之一。我不希望标记器将 space 视为分隔符。我该怎么做?
@anurag86 如果你想忽略空格 - 只需在第一个参数中构造像“;”这样的分隔符。以上是关于boost::tokenizer 考虑分隔符之间没有标记的主要内容,如果未能解决你的问题,请参考以下文章
使用 BOOST Tokenizer 来显示分隔符并且不在引号中标记字符串
如何定义 boost tokenizer 以返回 boost::iterator_range<const char*>