Regex C++;流上的正则表达式

Regex C++;流上的正则表达式,regex,c++11,iterator,Regex,C++11,Iterator,我有一个非常大的文本文件(高达几百MB),我想用STL正则表达式处理它。我要查找的匹配区域跨越几行,并且在文件中至少出现几千次 我可以为此使用流迭代器吗?我试过std::istream_迭代器,但没有成功。你能举一个简单的例子吗 请注意,我正在寻找只涉及STL的解决方案。在完美的解决方案中,我希望迭代所有匹配项 编辑 一旦我读了评论,我明白这是不可能的。因此,也许有另一种方法可以迭代大型文本文件中的正则表达式匹配: #include <regex> #include <iost

我有一个非常大的文本文件(高达几百MB),我想用STL正则表达式处理它。我要查找的匹配区域跨越几行,并且在文件中至少出现几千次

我可以为此使用流迭代器吗?我试过std::istream_迭代器,但没有成功。你能举一个简单的例子吗

请注意,我正在寻找只涉及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';
    }  
}
#包括
#包括
#包括
常量std::字符串s=R“(快速棕色狐狸
跳过
几行“;//此处至少有200MB的多行文字
int main(int argc,char*argv[]){
std::regex find_jumping_fox(((快速(?:.|\\n)+跳跃\\S*?)”;
auto-it=std::sregex_迭代器(s.begin()、s.end()、find_-fox);
for(std::sregx_迭代器i=it;i!=std::sregx_迭代器();++i){
std::smatch match=*i;
std::string match_str=match.str();

std::cout您不能在流上进行匹配,因为匹配失败意味着什么?正则表达式的开头是否匹配,需要输入更多字符,或者流中没有匹配的部分

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

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

这里有详细的解释:

“我可以使用流迭代器吗?”-简单回答:不。正则表达式匹配需要双向迭代器。这也不是任意限制。最好的办法是找到一个类,通过内部缓存将流迭代器适配为双向迭代器。但是,标准库不提供此功能。即使是
istreambuf_迭代器
,也是如此只有一个输入迭代器。如果您发布了示例代码,即使它实际上不起作用,也会有所帮助。我的意思是,只需一个带有几行的
main
函数,例如尝试使用
std::istream\u迭代器
。这将有助于确保其他人正确理解您的问题。为什么我们需要对输入进行迭代?匹配
std::regex的结果_match
已经是一个序列了。我认为0.2GB字符串在这些日子里已经不是那么大了。如果它不能放入地址空间(超过2GB?),就会出现真正的问题。@9dan:200MB是很多数据要加载到内存中,如果你实际上不需要的话。我真的希望程序停止这样做,因为“人们有很多RAM”!