Вот простое решение, которое использует только стандартную библиотеку регулярных выражений
#include <regex>
#include <string>
#include <vector>
std::vector<string> Tokenize( const string str, const std::regex regex )
{
using namespace std;
std::vector<string> result;
sregex_token_iterator it( str.begin(), str.end(), regex, -1 );
sregex_token_iterator reg_end;
for ( ; it != reg_end; ++it ) {
if ( !it->str().empty() ) //token could be empty:check
result.emplace_back( it->str() );
}
return result;
}
Аргумент regex позволяет проверять наличие нескольких аргументов (пробелы, запятые и т. Д.)
Я обычно проверяю разделение на пробелы и запятые, поэтому у меня также есть эта функция по умолчанию:
std::vector<string> TokenizeDefault( const string str )
{
using namespace std;
regex re( "[\\s,]+" );
return Tokenize( str, re );
}
"[\\s,]+"
проверяет пробелы (\\s
) и запятые (,
).
Обратите внимание, если вы хотите разделить wstring
вместо string
,
- изменить все
std::regex
на std::wregex
- изменить все
sregex_token_iterator
на wsregex_token_iterator
Обратите внимание, вы можете также взять строковый аргумент по ссылке, в зависимости от вашего компилятора.