C++ 11正则表达式堆栈溢出/ VS2012

Tom*_*Tom 9 c++ regex visual-c++ c++11 visual-studio-2012

我正在将一些旧的Boost正则表达式代码转换为C++ 11,我偶然发现了一个测试用例的问题.这是一个使用std :: regex导致堆栈溢出异常的场景,但与boost :: regex一起工作正常.我没有改变正则表达式模式,并且验证了模式是我想要的.看来这个特定的字符串输入片段导致堆栈溢出.使用VS2012,x64调试版本:

std::regex regx( "(^|\\})(([^\\{:])+:)+([^\\{]*\\{)" );

    const std::string testinput = " COLOR: #000; BACKGROUND-COLOR: #FFF; FONT-FAMILY: VERDANA, ARIAL, HELVETICA, SANS-SERIF; BACKGROUND:URL(URL(___FOO___)); BACKGROUND-2:URL(URL(___FOO___)); BORDER: 0 0 0 0; BORDER-2: 0 0 0; BORDER-3: 0 0; BORDER-4: 0PX; BORDER-5: 0.6; FILTER:PROGID:DXIMAGETRANSFORM.MICROSOFT.ALPHA(OPACITY=100); } ";
    std::smatch what;
    // this next line causes a stack overflow
    std::regex_search( testinput.cbegin(), testinput.cend(), what, regx );  
Run Code Online (Sandbox Code Playgroud)

在异常之后查看调用堆栈,似乎在正则表达式实现中正在进行某种类型的无限递归.我目前没有GCC来测试这个.我究竟做错了什么?

更新:在下面的建议之后,我将此代码粘贴到控制台应用程序,VS 2012 x64调试,我得到堆栈溢出.如果我将其更改为x64版本,或Win32调试或发布它运行正常.咦??? 我需要重新安装VS和/或平台SDK吗?我在Win7 x64上.

更新#2:有点相关的帖子: 为什么std :: regex_iterator会导致堆栈溢出这个数据? 我想如果我重写我的正则表达式,它可能会有所帮助.我仍然不确定为什么这个位子很重要.为什么它适用于其他人,但不适用于我的系统.叹.

小智 2

我已经用 x64 调试版本重现了这个,我相信这是一个真正的堆栈溢出

当您将堆栈大小更改为 10MB 左右(链接器命令行选项/STACK:"10000000")时,它将正常工作。