流上的C ++正则表达式

时间:2015-10-22 15:01:16

标签: regex c++11 iterator

我有一个非常大的文本文件(最多几百MB)我想用STL正则表达式处理。我正在寻找的匹配区域跨越几行,并在文件中至少发生几千次。

我可以为此目的使用流迭代器吗?我尝试过std :: istream_iterator,但没有运气。可以发布一个最小的工作示例吗?

请注意,我正在寻找仅涉及STL的解决方案。在完美的解决方案中,我想迭代所有比赛。

修改

一旦我阅读了评论,我就明白这是不可能的。所以也许有另一种方法可以在大文本文件中迭代正则表达式匹配:

#include <regex>
#include <iostream>
#include <string>

const std::string s = R"(Quick brown fox
jumps over
several lines)"; // At least 200MB of multiline text here

int main(int argc,char* argv[]) {

    std::regex find_jumping_fox("(Quick(?:.|\\n)+?jump\\S*?)");
    auto it = std::sregex_iterator(s.begin(), s.end(),        find_jumping_fox);

    for (std::sregex_iterator i = it; i != std::sregex_iterator(); ++i) {
        std::smatch match = *i;                                                 
        std::string match_str = match.str(); 
        std::cout << match_str << '\n';
    }  
}

1 个答案:

答案 0 :(得分:0)

您无法在视频流上进行匹配,导致匹配失败意味着什么?正则表达式的开头是否已匹配,并且需要输入更多字符,或者流中没有任何部分匹配。

但是在您进行编辑后,我们可以找到字符串的偏移量和匹配范围。您将要使用:

const vector<smatch> foo = { sregex_iterator(cbegin(s), cend(s), find_jumping_fox), sregex_iterator() }

在此详细说明:https://topanswers.xyz/cplusplus?q=729#a845