相关疑难解决方法(0)

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

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

c++ regex visual-c++ c++11 visual-studio-2012

9
推荐指数
1
解决办法
1403
查看次数

为什么std :: regex_iterator会导致堆栈溢出这个数据?

我一直在std::regex_iterator用来解析日志文件.我的程序已经运行了好几个星期并且解析了数百万条日志行,直到今天,今天我在日志文件中运行并且堆栈溢出.事实证明,日志文件中只有一个日志行导致了问题.有谁知道为什么我的正则表达式引起如此大规模的递归?这是一个小的自包含程序,它显示了问题(我的编译器是VC2012):

#include <string>
#include <regex>
#include <iostream>

using namespace std;

std::wstring test = L"L3  T15356 79726859 [CreateRegistryAction] Creating REGISTRY Action:\n"
                L"  Identity: 272A4FE2-A7EE-49B7-ABAF-7C57BEA0E081\n"
                L"  Description: Set Registry Value: \"SortOrder\" in Key HKEY_CURRENT_USER\\Software\\Hummingbird\\PowerDOCS\\Core\\Plugins\\Fusion\\Settings\\DetailColumns\\LONEDOCS1\\Search Unsaved\\$AUTHOR.FULL_NAME;DOCSADM.PEOPLE.SYSTEM_ID\n"
                L"  Operation: 3\n"
                L"  Hive: HKEY_CURRENT_USER\n"
                L"  Key: Software\\Hummingbird\\PowerDOCS\\Core\\Plugins\\Fusion\\Settings\\DetailColumns\\LONEDOCS1\\Search Unsaved\\$AUTHOR.FULL_NAME;DOCSADM.PEOPLE.SYSTEM_ID\n"
                L"  ValueName: SortOrder\n"
                L"  ValueType: REG_DWORD\n"
                L"  ValueData: 0\n"
                L"L4  T15356 79726859 [CEMRegistryValueAction::ClearRevertData] [ENTER]\n";

int wmain(int argc, wchar_t* argv[])
{
    static wregex rgx_log_lines(
        L"^L(\\d+)\\s+"             // Level
        L"T(\\d+)\\s+"              // TID
        L"(\\d+)\\s+"               // Timestamp
        L"\\[((?:\\w|\\:)+)\\]"     // Function …
Run Code Online (Sandbox Code Playgroud)

c++ regex c++11

7
推荐指数
1
解决办法
516
查看次数

标签 统计

c++ ×2

c++11 ×2

regex ×2

visual-c++ ×1

visual-studio-2012 ×1