为什么 C++ 正则表达式这么慢?

Sid*_*eus 5 c++ regex

我是 C++ 新手,必须处理文本文件。我决定用正则表达式来做到这一点。我想出的正则表达式:

(([^\\s^=]+)\\s*=\\s*)?\"?([^\"^\\s^;]+)\"?\\s*;[!?](\\w+)\\s*
Run Code Online (Sandbox Code Playgroud)

我已经根据以下帖子编写了我的 C++ 代码:

c ++ regex 使用 regex_search() 提取所有子字符串

这是 C++ 代码:

#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
#include <chrono>
#include <iterator>

void print(std::smatch match)
{
}

int main()
{
    std::ifstream file{ "D:\\File.txt" };
    std::string fileData{};

    file.seekg(0, std::ios::end);
    fileData.reserve(file.tellg());
    file.seekg(0, std::ios::beg);

    fileData.assign(std::istreambuf_iterator<char>(file), 
    std::istreambuf_iterator<char>());

    static const std::string pattern{ "(([^\\s^=]+)\\s*=\\s*)?\"? 
    ([^\"^\\s^;]+)\"?\\s*;[!?](\\w+)\\s*" };
    std::regex reg{ pattern };
    std::sregex_iterator iter(fileData.begin(), fileData.end(), reg);
    std::sregex_iterator end;

    const auto before = std::chrono::high_resolution_clock::now();

    std::for_each(iter, end, print);

    const auto after = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> delta = after - before;
    std::cout << delta.count() << "ms\n";

    file.close();
}
Run Code Online (Sandbox Code Playgroud)

我正在处理的文件包含 541 行。上面的程序需要 5 秒才能获得所有 507 个匹配项。我以前在 C# 中做过这样的事情,从来没有这么慢的正则表达式。所以我在 C# 中尝试了同样的事情:

var filedata = File.ReadAllText("D:\\File.txt", Encoding.Default);

const string regexPattern = 
    "(([^\\s^=]+)\\s*=\\s*)?\"?([^\"^\\s^;]+)\"?\\s*;[!?](\\w+)\\s*";

var regex = new Regex(regexPattern, RegexOptions.Multiline |      
    RegexOptions.Compiled );
    var matches = regex.Matches(filedata);

foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}
Run Code Online (Sandbox Code Playgroud)

这只需要 500 毫秒就可以找到所有 507 个匹配项 + 在控制台上打印它。因为我必须使用 C++,所以我需要更快。

如何使我的 C++ 程序更快?我做错了什么?

pre*_*uin 3

我刚刚遇到了同样的问题,最后我替换std::regexboost::regex,我想你也可以尝试另一个正则表达式库(boost/google re2...)。

更新:我正在使用 GCC 5.4。