我一直在使用该<regex>
库(Microsoft Visual Studio 2012:Update 3),尝试使用它为我的应用程序实现一个稍微安全的加载过程,并且遇到了一些初期困难(参见正则表达式导致堆栈溢出,同时使用 std::regex, defined behavior?和ECMAScript Regex 用于多行字符串)。
通过使用此处建议的正则表达式,我解决了最初的麻烦(导致堆栈溢出等),并且运行良好;但是,如果我的文件太大,则会导致堆栈溢出(我通过增加堆栈提交和保留大小来规避),或者如果堆栈大小足够大而不会导致堆栈溢出,则会导致std::regex_error
with 错误代码12 (error_stack)
。
这是一个复制问题的独立示例:
#include <iostream>
#include <string>
#include <regex>
std::string szTest = "=== TEST1 ===\n<Example1>:Test Data\n<Example2>:More Test Data\n<Example3>:Test\nMultiline\nData\n<Example4>:test_email@test.com\n<Example5>:0123456789\n=== END TEST1 ===\n=== TEST2 ===\n<Example1>:Test Data 2\n<Example2>:More Test Data 2\n<Example3>:Test\nMultiline\nData\n2\n<Example4>:test_email2@test.com\n=== END TEST2 ===\n=== TEST3 ===\n<Example1>:Random Test Data\n<Example 2>:More Random Test Data\n<Example 3>:Some\nMultiline\nRandom\nStuff\n=== END TEST3 ===\n\
=== TEST1 ===\n<Example1>:Test Data (Second)\n<Example2>:Even More Test Data\n<Example3>:0123456431\n=== END TEST1 ===";
int main()
{
static const std::regex regexObject( "=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===", std::regex_constants::ECMAScript | std::regex_constants::optimize );
for( std::sregex_iterator itObject( szTest.cbegin(), szTest.cend(), regexObject ), end; itObject != end; ++itObject )
{
std::cout << "Type: " << (*itObject)[1].str() << std::endl;
std::cout << "Data: " << (*itObject)[2].str() << std::endl;
std::cout << "-------------------------------------" << std::endl;
}
}
使用默认堆栈大小(4kB 提交和 1MB 保留)编译它会导致抛出堆栈溢出异常;并且在更改堆栈大小(8kB 提交和 2MB 保留)时,会导致std::regex_error
抛出错误代码12 (error_stack)
。
我可以做些什么来防止这些错误,或者仅仅是正则表达式库被设计为仅用于小字符串(即 DoB 检查等)?
提前致谢!