Я анализирую файл метаданных, в котором разделителем является пробел ' '
. Файл метаданных содержит строки, в которых разделитель пробелов должен быть опущен. Таким образом, "\"This Space\""
- это один токен, а "This Space"
- два токена.Токенирование завернутой строки с использованием boost :: tokenizer
Есть вопросы, подобные этому here с ответом о том, как получить результат, не используя boost::tokenizer
. Это похоже на задачу по умолчанию для токенизатора, и я предполагаю, что это должно быть возможно с использованием boost::tokenizer
.
Я написал пример, чтобы показать, что я сделал до сих пор:
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
#include <iostream>
using std::string;
using data = std::vector<string>;
data buildExpected()
{
string s[] = {"This", "is one of", "42", "lines" };
return data(s, s + 4);
}
data tokenizeLine(string line)
{
using namespace boost;
data d;
char_separator<char> sep("\" ");
tokenizer<char_separator<char>> tokens(line, sep);
for (string tok : tokens) d.push_back(tok);
return d;
}
void logData(string id, data &d)
{
string line = "(" + id + "):";
bool more = 0;
for (auto s : d)
{
if (more) line += "; ";
more = 1;
line += s;
}
std::cout << line << std::endl;
}
void main()
{
string line = "This \"is one of\" 42 lines";
data expected = buildExpected();
data actual = tokenizeLine(line);
logData("expected", expected);
logData("actual ", actual);
}
Это выход на моей системе:
Полагаю, мне нужно выполнить сложность и использовать другую библиотеку. – Johannes
не должно быть действительно сложно реализовать то, что вам нужно с Boost.Tokenizer, особенно если вам не нужно поддерживать включенные кавычки, вы знаете что-то вроде «quote with» подкатегория »« –
Я свернул подобные вещи в прошлое, но я предпочел бы использовать что-то с полки. На данный момент я просто слегка присоединяю часть токенизатора настолько хорошо, насколько могу, и заменяю ее, когда она становится проблемой. – Johannes