其他分享
首页 > 其他分享> > c-Boost :: tokenizer点分开,但也保留空白字段

c-Boost :: tokenizer点分开,但也保留空白字段

作者:互联网

我见过this question,而我的和它非常相似,但是它是不同的,所以请不要将其标记为重复.

我的问题是:如何从字符串中获取空字段?

我有一个字符串,如std :: string s =“ This.is..a.test”;我想获取< This>字段&LT是&GT &LT&GT &LT a取代; <试验取代. 我也尝试过

typedef boost::char_separator<char> ChSep;
typedef boost::tokenizer<ChSep> TknChSep;
ChSep sep(".", ".", boost::keep_empty_tokens);
TknChSep tok(s, sep);
for (TknChSep::iterator beg = tok.begin(); beg != tok.end(); ++beg)
{
  std::cout << "<" << *beg << "> ";
}

但我得到< This> &LT&GT &LT是&GT &LT&GT &LT&GT &LT&GT &LT a取代; <试验取代.

解决方法:

Boost.Tokenizer的char_separator的第二个参数是keep_delims参数.用于指定将显示为标记的定界符.原始代码指定为“.”.应该保留为令牌.要解决此问题,请更改:

ChSep sep(".", ".", boost::keep_empty_tokens);

至:

ChSep sep(".", "", boost::keep_empty_tokens);
            // ^-- no delimiters will show up as tokens.

这是一个完整的示例:

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

int main()
{
  std::string str = "This.is..a.test";
  typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
  boost::char_separator<char> sep(
      ".", // dropped delimiters
      "",  // kept delimiters
      boost::keep_empty_tokens); // empty token policy

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

产生所需的输出:

<This> <is> <> <a> <test> 

标签:c,tokenize,boost
来源: https://codeday.me/bug/20191010/1888736.html