повысить регулярное выражение токенизатор и перевод строки - PullRequest
2 голосов
/ 22 апреля 2011

В настоящее время я пытаюсь разбить текстовый файл на вектор строк, когда встречается новая строка.Ранее я использовал для этого расширенный токенизатор с другими символами-разделителями, но при использовании новой строки '\ n' во время выполнения возникает исключение:

terminate called after throwing an instance of 'boost::escaped_list_error'
  what():  unknown escape sequence
Aborted

Вот код:

std::vector<std::string> parse_lines(const std::string& input_str){
    using namespace boost;
    std::vector<std::string> parsed;
    tokenizer<escaped_list_separator<char> > tk(input_str, escaped_list_separator<char>('\n'));
    for (tokenizer<escaped_list_separator<char> >::iterator i(tk3.begin());
                i != tk.end(); ++i) 
    {
       parsed.push_back(*i);
    }
    return parsed;
}

Любой совет с благодарностью!

Ответы [ 3 ]

4 голосов
/ 22 апреля 2011
Конструктор

escaped_list_separator ожидает escape-символ, затем символ-разделитель, затем символ кавычки. Используя новую строку в качестве escape-символа, он обрабатывает первый символ в каждой строке вашего ввода как часть escape-последовательности. Попробуйте вместо этого.

escaped_list_separator<char>('\\', '\n')

http://www.boost.org/doc/libs/1_46_1/libs/tokenizer/escaped_list_separator.htm

3 голосов
/ 22 апреля 2011

Учитывая, что требуемый разделитель уже напрямую поддерживается стандартной библиотекой, я думаю, что я вообще пропущу использование регулярных выражений для этого и использую то, что уже присутствует в стандартной библиотеке:

std::vector<std::string> parse_lines(std::string const &input_string) { 
    std::istringstream buffer(input_string);
    std::vector<std::string> ret;
    std::string line;

    while (std::getline(buffer, line))
        ret.push_back(line);
    return ret;
}

Как только вы решите проблему, рассматривая строку как поток и читая строки оттуда, у вас есть довольно много опций относительно деталей того, как вы идете оттуда. Просто для пары примеров, вы можете использовать классы линейного прокси и / или LineInputIterator, которые @UncleBens и я опубликовали в ответ на предыдущий вопрос .

1 голос
/ 22 апреля 2011

Это может сработать лучше.

boost::char_separator<char> sep("\n");
boost::tokenizer<boost::char_separator<char>> tokens(text, sep);

Редактировать: Вы также можете использовать std::find и создать свой собственный цикл сплиттера.

...