流上的C++正则表达式

tno*_*rgd 6 regex iterator c++11

我有一个非常大的文本文件(最多几百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';
    }  
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Mee 1

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

但编辑后,我们可以找到字符串上的偏移量和匹配范围。你会想要使用:

const vector<smatch> foo = { sregex_iterator(cbegin(s), cend(s), find_jumping_fox), sregex_iterator() }
Run Code Online (Sandbox Code Playgroud)

这里有完整的详细解释: https: //topanswers.xyz/cplusplus ?q=729#a845