Можете ли вы использовать Boost.Regex для анализа потока?

Я играл с Boost.Regex для анализа строк для слов и чисел. Это то, что у меня есть до сих пор:

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/regex.hpp>
#include <boost/range.hpp>

using namespace std;
using namespace boost;

int main()
{
    regex re
    (
        "("
            "([a-z]+)|"
            "(-?[0-9]+(\\.[0-9]+)?)"
        ")"
    );

    string s = "here is a\t list of Words. and some 1239.32 numbers to 3323 parse.";
    sregex_iterator m1(s.begin(), s.end(), re), m2;

    BOOST_FOREACH (const match_results<string::const_iterator>& what, make_iterator_range(m1, m2)) {
        cout << ":" << what[1].str() << ":" << what.position(1) << ":" << what.length(1) << endl;
    }

    return 0;
}

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

Ответ 1

Boost.IOStreams имеет regex_filter, позволяющий выполнять эквивалент regex_replace в потоке. Однако, глядя на реализацию, кажется, что он "обманывает" тем, что он просто загружает весь поток в буфер и затем вызывает Boost.Regex в этом буфере.

Выполнение поиска регулярных выражений в содержимом потока без его полной загрузки в память может быть выполнено с помощью partial match" поддержки библиотека Boost.regex. Посмотрите на пример в конце страницы.

Ответ 2

Конструктор regex_iterator требует двунаправленных Итераторов, но std:: istream_iterator является только InputIterator, поэтому кажется, что вы не сможете сделать это с помощью любого из стандартных классов потоков и/или объектов (cin, ifstream и т.д.). Если у вас был пользовательский поток, который показывал двунаправленный итератор, он должен работать.

Ответ 3

Конечный конечный автомат должен иметь возможность "резервное копирование" на случай, если он сейчас пытается выполнить. Это невозможно для итераторов ввода, которые не могут "выполнить резервное копирование".