为什么regex_match抛出“复杂性异常”?

里奥洛

我正在尝试测试(使用boost::regex)文件中的行是否仅包含由空格分隔的数字条目。我遇到了一个我不理解的异常(见下文)。如果有人可以解释为什么会抛出它,那就太好了。也许我在定义模式时在做一些愚蠢的事情?这是代码:

// regex_test.cpp
#include <string>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;

int main(){
  // My basic pattern to test for a single numeric expression
  const string numeric_value_pattern = "(?:-|\\+)?[[:d:]]+\\.?[[:d:]]*";
  // pattern for the full line
  const string numeric_sequence_pattern = "([[:s:]]*"+numeric_value_pattern+"[[:s:]]*)+";

  regex r(numeric_sequence_pattern);
  string line= "1 2 3 4.444444444444";
  bool match = regex_match(line, r);
  cout<<match<<endl;

  //...
}

我成功编译了

g++ -std=c++11 -L/usr/lib64/ -lboost_regex regex_test.cpp  

到目前为止,最终的程序运行良好,而且match == true依我所愿。但是后来我测试了一条输入线

string line= "1 2 3 4.44444444e-16"; 

当然,我的模式并不是为了识别格式4.44444444e-16建立的,我希望那是可以的match == false但是,相反,我得到以下运行时错误:

terminate called after throwing an instance of  
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >'  
  what():  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.  

这是为什么?
注意:我给出的示例是极端的,因为在点后面少放一位数字就可以了。那意味着

string line= "1 2 3 4.4444444e-16";

只是产生match == false预期的结果所以,我感到困惑。这是怎么回事

已经谢谢你了!


更新:
问题似乎已经解决。考虑到alejrb的提示,我将模式重构为

const string numeric_value_pattern = "(?:-|\\+)?[[:d:]]+(?:\\.[[:d:]]*)?";  

这似乎应该工作。不知何故,\\.原始模式内的孤立可选内容[[:d:]]+\\.?[[:d:]]*留下了许多以不同方式匹配长数字序列的可能性。
我希望这种模式现在是安全的。但是,如果有人找到一种以新形式炸毁它的方法,请告诉我!对于我来说,这是否仍然可能还不是很明显。

阿列布

我想说您的正则表达式可能成指数回溯。为了保护您免受循环的影响,如果输入不再存在,循环将变得完全不可行,正则表达式引擎会中止尝试。

经常导致此问题的一种模式是任何形式的(x+x+)+-当您将第一种模式放置在第二种模式中时,会在此处建立该模式。

http://www.regular-expressions.info/catastrophic.html上有很好的讨论

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么regex_match抛出“复杂性异常”?

来自分类Dev

为什么regex_match是函数而不是类regex的方法?

来自分类Dev

此功能的复杂性是什么?

来自分类Dev

`sort_by`的复杂性是什么?

来自分类Dev

该算法的复杂性是什么?

来自分类Dev

以下语句的复杂性是什么?

来自分类Dev

`sort_by`的复杂性是什么?

来自分类Dev

在libc ++上,为什么regex_match(“ tournament”,regex(“ tour | to | tournament”))失败?

来自分类Dev

在libc ++上,为什么regex_match(“ tournament”,regex(“ tour | to | tournament”))失败?

来自分类Dev

为什么我的密码复杂性正则表达式不接受我的价值?

来自分类Dev

为什么日志如此频繁地出现在算法复杂性上?

来自分类Dev

为什么没有2 *在空间复杂性复发S(N)= 2 * S(N / 2)?

来自分类Dev

为什么java不像C++那样记录渐近复杂性?

来自分类Dev

复杂的regex_match在C ++中不起作用

来自分类Dev

Powershell New-ADUser密码复杂性异常

来自分类Dev

该代码的复杂性是什么?我们应该总结复杂性吗?

来自分类Dev

为什么C ++ regex_match函数要求在该函数之外定义搜索字符串?

来自分类Dev

为什么$模式不会使std :: regex_match返回true?

来自分类Dev

为什么std :: regex_match不支持“零长度断言”?

来自分类Dev

为什么 regex_match 与我的正则表达式不匹配?

来自分类Dev

LinkedHashMap的复杂性

来自分类Dev

NFA的复杂性

来自分类Dev

查询的复杂性?

来自分类Dev

插入的复杂性

来自分类Dev

在Access VBA中实现Regex以实现密码复杂性

来自分类Dev

为什么start()抛出异常?

来自分类Dev

List.Add的渐近复杂性是什么?

来自分类Dev

string.matches的复杂性是什么?

来自分类Dev

getJSONObject和getJSONArray方法的复杂性是什么?

Related 相关文章

  1. 1

    为什么regex_match抛出“复杂性异常”?

  2. 2

    为什么regex_match是函数而不是类regex的方法?

  3. 3

    此功能的复杂性是什么?

  4. 4

    `sort_by`的复杂性是什么?

  5. 5

    该算法的复杂性是什么?

  6. 6

    以下语句的复杂性是什么?

  7. 7

    `sort_by`的复杂性是什么?

  8. 8

    在libc ++上,为什么regex_match(“ tournament”,regex(“ tour | to | tournament”))失败?

  9. 9

    在libc ++上,为什么regex_match(“ tournament”,regex(“ tour | to | tournament”))失败?

  10. 10

    为什么我的密码复杂性正则表达式不接受我的价值?

  11. 11

    为什么日志如此频繁地出现在算法复杂性上?

  12. 12

    为什么没有2 *在空间复杂性复发S(N)= 2 * S(N / 2)?

  13. 13

    为什么java不像C++那样记录渐近复杂性?

  14. 14

    复杂的regex_match在C ++中不起作用

  15. 15

    Powershell New-ADUser密码复杂性异常

  16. 16

    该代码的复杂性是什么?我们应该总结复杂性吗?

  17. 17

    为什么C ++ regex_match函数要求在该函数之外定义搜索字符串?

  18. 18

    为什么$模式不会使std :: regex_match返回true?

  19. 19

    为什么std :: regex_match不支持“零长度断言”?

  20. 20

    为什么 regex_match 与我的正则表达式不匹配?

  21. 21

    LinkedHashMap的复杂性

  22. 22

    NFA的复杂性

  23. 23

    查询的复杂性?

  24. 24

    插入的复杂性

  25. 25

    在Access VBA中实现Regex以实现密码复杂性

  26. 26

    为什么start()抛出异常?

  27. 27

    List.Add的渐近复杂性是什么?

  28. 28

    string.matches的复杂性是什么?

  29. 29

    getJSONObject和getJSONArray方法的复杂性是什么?

热门标签

归档