Можете ли вы использовать Boost.Regex для анализа потока? - PullRequest
10 голосов
/ 19 января 2009

Я играл с 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;
}

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

Ответы [ 3 ]

5 голосов
/ 09 февраля 2009

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

Выполнение поиска регулярного выражения по содержимому потока без необходимости полной загрузки его в память может быть выполнено с поддержкой "10000 * частичное совпадение " Boost.Regex. Посмотрите на пример в конце страницы.

2 голосов
/ 19 января 2009

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

1 голос
/ 20 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...