你能用Boost.Regex解析一个流吗?

时间:2009-01-19 13:36:10

标签: c++ regex boost stream

我正在玩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 个答案:

答案 0 :(得分:5)

Boost.IOStreams有一个regex_filter,允许用户在流上执行等效的regex_replace。但是,看看实现,它似乎“作弊”,因为它只是将整个流加载到缓冲区中,然后在该缓冲区上调用Boost.Regex。

对流的内容进行正则表达式搜索而不必将其完全加载到内存中可以使用Boost.Regex的“partial match”支持。请查看页面末尾的示例。

答案 1 :(得分:2)

regex_iterator构造函数需要BidirectionalIterators,但是std :: istream_iterator只是一个InputIterator,因此您似乎无法使用任何标准流类和/或对象(cin,ifstream等)执行此操作。 )。如果您有一个暴露双向迭代器的自定义流,它应该可以工作。

答案 2 :(得分:1)

有限状态机需要能够“备份”,以防它现在正在尝试失败。输入迭代器不可能“备份”。