10

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;
}

文字列ではなくストリームから解析するように正規表現に指示する方法はありますか? 任意のイテレータを使用できるように思われます。

4

3 に答える 3

5

Boost.IOStreams にはregex_filterがあり、ストリームに対して regex_replace と同等の処理を実行できます。ただし、実装を見ると、ストリーム全体をバッファーにロードしてから、そのバッファーで Boost.Regex を呼び出すという点で「ごまかしている」ようです。

Boost.Regex の「部分一致」サポートを使用すると、ストリームのコンテンツを完全にメモリにロードすることなく正規表現検索を行うことができます。ページの最後にある例を見てください。

于 2009-02-09T20:16:04.800 に答える
2

regex_iteratorコンストラクターにはBidirectionIteratorsが必要ですが、std :: istream_iteratorはInputIteratorにすぎないため、標準ストリームクラスやオブジェクト(cin、ifstreamなど)ではこれを実行できないようです。双方向イテレータを公開するカスタムストリームがある場合は、機能するはずです。

于 2009-01-19T15:23:46.960 に答える
1

有限状態マシンは、現在試行していることが失敗した場合に備えて「バックアップ」できる必要があります。これは、「バックアップ」できない入力イテレータでは不可能です。

于 2011-12-20T07:29:38.330 に答える