【问题标题】:C++ regex on partial data部分数据的 C++ 正则表达式
【发布时间】:2014-07-28 09:07:05
【问题描述】:

我有一个回调函数,它提供指向数据及其大小的指针。我不知道下一次是什么尺寸,最后一次是哪个电话。我需要用正则表达式匹配传入的数据并保存匹配项。 类似的东西。

class data_filter
{
public:
    data_filter(const std::string& re)
        : re_(re)
    {}
public:
    // callback func. It will be called many times with data parts
    void process(const char* data, const size_t len) 
    {
        re_.match(data, len, m_); // if found match, add it to matches
    }

public:
    void print_matches()
    {
        for(size_t i = 0; i < m_.size(); ++i)
        {
            std::cout << m_[i] << std::endl;
        }
    }
private:
    some_cool_regex re_;
    cool_regex_matches m_;
};

如果绝对必要,我可以为正则表达式回溯提供一些固定缓冲区,但我想避免它。 我已经用partial_match 选项简要了解了boost::regex。据我第一眼了解它可以提供这样的功能,但用户应该手动处理临时缓冲区。

那么,我应该坚持使用 boost 还是有一些库更符合我的需求? 谢谢。

【问题讨论】:

    标签: c++ regex search boost streaming


    【解决方案1】:

    由于确实可能需要回溯,因此您的流式传输选择有限或不存在。

    Boost Spirit 通过在输入迭代器周围使用multi_pass_iterator&lt;&gt; 适配器“解决”了同样的问题。适配器能够维护先前读取数据的缓冲区以进行回溯,并在不再需要时立即释放它(例如,由于期望点)。

    如果你分享了一些关于“一些很酷的正则表达式”的细节,那么我可能会告诉你如何做到这一点。

    更新刚刚找到这个库:https://github.com/openresty/sregex

    libsregex - 用于大型数据流的非回溯正则表达式引擎库

    【讨论】:

    • 我自己也不知道这些细节。理想情况下,它应该按照我的示例中所述使用。另外,我可以提供一些数据缓冲区(向量、数组等)用于回溯。对于正则表达式字符串本身,它们没有限制。一切都是有效的正则表达式。
    • 请注意,我刚刚找到了一个可能有帮助的库:请参阅更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多