Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么boost正则表达式耗尽了堆栈空间?_C++_Regex_Boost_Boost Regex - Fatal编程技术网

C++ 为什么boost正则表达式耗尽了堆栈空间?

C++ 为什么boost正则表达式耗尽了堆栈空间?,c++,regex,boost,boost-regex,C++,Regex,Boost,Boost Regex,编辑 我的平台: g++ regex.cc -lboost_regex 在本地进行了测试,效果很好,我猜你的编译器正在做一些奇怪的事情 什么版本的gcc?什么站台?哪个版本的boost g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 libboost-regex1.42 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz So the latest Ubuntu 64 bit ->./regex 向量 标准::地图 st

编辑

我的平台:

g++ regex.cc -lboost_regex

在本地进行了测试,效果很好,我猜你的编译器正在做一些奇怪的事情

什么版本的gcc?什么站台?哪个版本的boost

g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
libboost-regex1.42
Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
So the latest Ubuntu 64 bit
->./regex
向量
标准::地图
std::pair
试验
试验
::
int
((\\w+)(::)?)+
是一种所谓的“病理性”正则表达式——它需要指数时间,因为有两个表达式彼此依赖,一个接一个。也就是说,它由于以下原因而失败

考虑我们是否遵循链接的示例,并将“更复杂的东西”减少为“x”。让我们用
\\w

  • ((x+)(:)?)+
我们还假设我们的输入永远不会有
。这样做实际上会使正则表达式变得更复杂,因此如果我们抛开复杂性,那么我们真的应该让事情变得更简单,如果没有其他事情的话:

  • (x+)+
现在你已经有了一个教科书中嵌套的量词问题,如上面链接中所详述的那样

有几种方法可以解决这个问题,但最简单的方法可能是使用“
(?>
”)不允许对内部匹配进行回溯:

  • ((?>\\w+)(:)?)+

我的测试是使用
boost-1.42/gcc版本4.5.1(Gentoo 4.5.1-r1 p1.4,pie-0.4.5)
,是否可以尝试不同版本的gcc和/或boost?奇怪。我可以在其他地方尝试,但稍后。我会看到我对其他版本的能力。仅供参考,我点击此网页是因为代码在旧版本的boost(1.43.0)下工作在新版本的boost(1.53.0)上点击此堆栈空间错误。因此,boost的版本似乎与问题是否出现有关。病理子正则表达式可能是问题所在,但不是您提到的--
\w
只是
[a-Za-z0-9]
或差不多,所以它已经排除了
就像你建议的修复一样,所以需要相同的时间。另外,我认为你需要两个正则表达式都有一个开始参数。@j_random_hacker:嗯……很好。我建议的修复不能解决问题,但灾难性的回溯是问题。给我一点时间来修复它。你能吗你重现了这个问题吗?@nice:
std::vector,?)+>
对我有用。(我使用RegexBuddy进行测试而不是Boost)@nice:好吧,这很公平,但如果进行任何回溯,打开该功能几乎肯定会毁掉整个堆栈,因此我建议不要这样做。
g++ regex.cc -lboost_regex
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
libboost-regex1.42
Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
So the latest Ubuntu 64 bit
 -> ./regex
std::vector<std::map<std::pair<Test::Test, int>,std::pair<Test::Test, int>,std::pair<Test::Test, int>>,std::map<std::pair<Test::Test, int>,std::pair<Test::Test, int>,std::pair<Test::Test, int>>>
std::map<std::pair<Test::Test, int>,std::pair<Test::Test, int>,std::pair<Test::Test, int>>
std::pair<Test::Test, int>
Test
Test
::
int