gpt4 book ai didi

c++ - std::regex_replace 期间的堆栈溢出

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:35 25 4
gpt4 key购买 nike

我正在尝试执行以下基于 C++ STL 的代码来替换相对较大的 SQL 脚本 (~8MB) 中的文本:

std::basic_regex<TCHAR> reProc("^[ \t]*create[ \t]+(view|procedure|proc)+[ \t]+(.+)$\n((^(?![ \t]*go[ \t]*).*$\n)+)^[ \t]*go[ \t]*$");
std::basic_string<TCHAR> replace = _T("ALTER $1 $2\n$3\ngo");
return std::regex_replace(strInput, reProc, replace);

结果是堆栈溢出,并且很难在该特定站点上找到有关该特定错误的信息,因为这也是该站点的名称。

编辑:我使用的是 Visual Studio 2013 Update 5

编辑 2: 原始文件超过 23,000 行。我将文件减少到 3,500 行,但仍然出现错误。当我将它再减少约 50 行到 3,456 行时,错误消失了。如果我只将那些剪切的行放入文件中,错误仍然存​​在。这表明错误与特定文本无关,而只是太多了。

编辑 3:此处演示了一个完整的工作示例正常运行: https://regex101.com/r/iD1zY6/1不过,它在该 STL 代码中不起作用。

最佳答案

根据 regex101(参见 here),您的正则表达式的以下精简版本节省了大约 20% 的处理步骤。

\\bcreate[ \t]+(view|procedure|proc)[ \t]+(.+)\n(((?![ \t]*go[ \t]*).*\n)+)[ \t]*go[ \t]*

修改:

  • 删除了内联 anchor :您正在明确测试换行符
  • 删除了 db 对象关键字的重复运算符 - 此时的重复会使原始脚本在句法上无效。
  • 初始空白模式由单词边界替换(注意双反斜杠 - 转义序列用于正则表达式引擎,而不用于编译器)

如果你能确定...

  • create ... 语句不会出现在字符串文字中,并且

  • 您不需要区分 create ... 语句是否后跟 go(例如,因为所有语句都以 )

...仅替换这些字符串甚至可能更容易:

std::basic_regex<TCHAR> reProc("\bcreate[ \t]+(view|procedure|proc)");
std::basic_string<TCHAR> replace = _T("ALTER $1");
return std::regex_replace(strInput, reProc, replace);

(Here 是后一种方法的演示 - 将步骤减少到 1/4 多一点)。

关于c++ - std::regex_replace 期间的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37304460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com