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&lt;char&gt; obj(";"," ",boost::keep_empty_tokens); @anurag86 看,在我的代码中没有空格,只有空字符串。 我的意思是我得到了 2 个问题的答案。我现在要问的是,如果我的字符串包含 ; 分隔字段,如果字段本身包含空格,那么标记器将 space 也视为分隔符之一。我不希望标记器将 space 视为分隔符。我该怎么做? @anurag86 如果你想忽略空格 - 只需在第一个参数中构造像“;”这样的分隔符。

以上是关于boost::tokenizer 考虑分隔符之间没有标记的主要内容,如果未能解决你的问题,请参考以下文章

使用 BOOST Tokenizer 来显示分隔符并且不在引号中标记字符串

从 Boost::Tokenizer 中删除重复项?

如何定义 boost tokenizer 以返回 boost::iterator_range<const char*>

字符串迭代器不兼容 boost::tokenizer

如何使用 boost::tokenizer 作为 C++ 类成员?

Boost.Tokenizer 用于引号和括号