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