Boost:: tokenizer точка отделена, но также сохраняя пустые поля
Я видел этот вопрос и мой очень похож на него, но он отличается, поэтому, пожалуйста, не отмечайте его как дубликат.
Мой вопрос: Как получить пустые поля из строки?
У меня есть строка типа std::string s = "This.is..a.test";
, и я хочу получить поля <This> <is> <> <a> <test>
.
Я тоже пробовал
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> <.> <is> <.> <> <.> <a> <test>
.
2 ответа:
Второй аргумент для повышения.Токенизатор
char_separator
является параметромkept_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>
Я думаю, что пропустил бы
Boost::tokenizer
и просто использовал стандартное регулярное выражение для разбиения:#include <iterator> #include <regex> #include <string> #include <iostream> int main() { std::string s = "This.is..a.test"; std::regex sep{ "\\." }; std::copy(std::sregex_token_iterator(s.begin(), s.end(), sep, -1), std::sregex_token_iterator(), std::ostream_iterator<std::string>(std::cout, "\n")); }
Результат:
This is a test