Boost正则表达式引发复杂性异常,而std :: regex则不然

时间:2016-09-26 21:52:38

标签: c++ regex macos boost boost-regex

我遇到了一个奇怪的问题 - 我使用的库使用正则表达式,可以是booststd,具体取决于配置期间提供的选项。由于其他原因,我无法在代码中使用std::regex并使用boost代替。当我开始调用内部使用正则表达式的库函数时,我的代码被阻止了。经过几个小时的调试问题,我找到了它。简而言之,此代码阻止:

std::string str = "/a/b/c/d/e/KEY/h/dsk-1474591592/ID-CERT";
std::string pattern = "^((?:(?!/KEY)(?:/.*)*)*)/KEY((?:/.+?)*)/ksk-.+/ID-CERT";
boost::regex re = regex(pattern);
boost::sregex_iterator iterator = boost::sregex_iterator(str.begin(), str.end(), re);

当我使用此代码制作一个小测试程序时,我得到了例外:

libc++abi.dylib: terminating with uncaught exception of type boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >: The complexity of matching the regular expression exceeded predefined bounds.  Try refactoring the regular expression to make each choice made by the state machine unambiguous.  This exception is thrown to prevent "eternal" matches that take an indefinite period time to locate.
Abort trap: 6

相同的代码,如果改为使用std :: regex,则不会抛出。

我尝试了几个升级版本--1.54,1.58,1.59 - 全部抛出。我需要为此找到一个解决方法 - 抑制从boost(这可能是危险的)抛出这个确切的异常或使regex更简单(首选)。不幸的是,我没有太多关于正则表达式的经验,任何关于如何简化它的建议都将受到高度赞赏!

更新(附加信息):

上面提到的正则表达式是如何克服的:它是由library处理的结果正则表达式。它在此NDN-regex中使用function并将其传递给此sanitizing function

1 个答案:

答案 0 :(得分:0)

boost::regex(和std::regex)在决定表达式过于复杂时会抛出异常。有关error_complexity及相关error_stack的说明,请参阅标准中的[re.err]。

  

error_complexity 尝试与正则表达式匹配的复杂程度超出了预设水平。

它是如何决定的,而“太复杂”的是实现定义的。

所以,你所看到的是“非常好”,但这对你来说并不是一个有用的答案。