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会导致堆栈溢出这个数据? 我想如果我重写我的正则表达式,它可能会有所帮助.我仍然不确定为什么这个位子很重要.为什么它适用于其他人,但不适用于我的系统.叹.