2013-04-01 2 views
4

я в настоящее время есть строка, которая имеет следующую структурурасщепленных с помощью наддува :: is_any_of путает над разделителями «,,» и «»

xxx,xxx,xxxxxxx,,xxxxxx,xxxx 

Теперь я использую следующий код

std::vector<std::string> vct; 
boost::split(vct, str, boost::is_any_of(",,")); 

Теперь boost разбивает строку, как только она находит «,», а не «,,», которую я не хочу. Есть ли способ, который я мог бы явно указать, что он должен расколоться, только если он найдет «,,», а не «,»

+0

Весь смысл 'is_any_of' будет представлять какой-либо один из символов в строке, которую вы предоставляете. Если это не то, что вы хотите, тогда не используйте его. –

ответ

6

is_any_of(",,") соответствует всем, что указано в списке. В этом случае либо , или ,

Что вы ищете по линии

boost::algorithm::split_regex(vct, str, regex(",,")) ; 
+3

Я думаю, что вы получили его назад: он соответствует ',' или ',', а не ',' или ','. – Yakk

+1

Ох. Я исправлю это сразу :) – 2013-04-01 18:07:06

0

Is_any_of разбивает на любой из символов в строке. Он не будет делать то, что вы хотите. Вам нужно посмотреть в руководстве по ускорению для другого предиката.

Редактировать: Из любопытства Я сам искал в API, я не мог найти готового предиката для того, что вы хотите. В худшем случае вы должны написать это самостоятельно.

0
#include <functional> 
#include <boost/algorithm/string/compare.hpp> 
... 

std::vector<std::string> vct; 
//boost::split(vct, str, [](const auto& arg) { return arg == str::string(",,"); }); 
boost::split(vct, str, std::bind2nd(boost::is_equal, std::string(",,"))); 
3

Для дальнейшего использования ..

подталкивания :: Раскол занимает 4-й параметр eCompress, что может позволять обрабатывать соседние сепараторы в качестве отдельного сепаратора:

eCompress

Если eCompress аргумент установлен в token_compress_on, соседние сепараторы объединяются вместе. В противном случае, каждые два разделителя делит токен.

Все, что вам нужно сделать, это указать параметр. Вы можете пропустить второй , тоже, как:

boost::split(vct, str, boost::is_any_of(","), 
       boost::algorithm::token_compress_on) 

Here's the documentation.

Смежные вопросы