2015-12-09 2 views
0

Я анализирую файл метаданных, в котором разделителем является пробел ' '. Файл метаданных содержит строки, в которых разделитель пробелов должен быть опущен. Таким образом, "\"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); 

} 

Это выход на моей системе:

sample output

ответ

1

Boost.Tokenizer не обрабатывает кавычки. Его функциональность очень проста - просто разбивается на токены при каждом возникновении разделителя. Вам нужно самому обрабатывать скобки.

+0

Полагаю, мне нужно выполнить сложность и использовать другую библиотеку. – Johannes

+0

не должно быть действительно сложно реализовать то, что вам нужно с Boost.Tokenizer, особенно если вам не нужно поддерживать включенные кавычки, вы знаете что-то вроде «quote with» подкатегория »« –

+0

Я свернул подобные вещи в прошлое, но я предпочел бы использовать что-то с полки. На данный момент я просто слегка присоединяю часть токенизатора настолько хорошо, насколько могу, и заменяю ее, когда она становится проблемой. – Johannes

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