regex_match()&& regex_search()无限循环

时间:2015-08-31 12:22:22

标签: c++ regex

我编写了一个小函数来通过C ++中的正则表达式检查模式。使用任何在线正则表达式测试程序,我获得了我所期望从我编写的正则表达式中获得的行为,但我的C ++代码最终处于无限循环中。这是代码:

#include <string>
#include <regex>

bool check(const std::string& val, const std::string& sep) {
   const static std::string REGEX_STR("^.{1,}=.{1,}(" + sep + ".{1,})*$");
   const static std::regex REGEX(REGEX_STR);

   std::smatch match;
   //this end up in an infinite loop
   return (std::regex_search(val, match, REGEX) && match.size() > 0);

   //this also end up in an infinite loop
   return std::regex_match(val, REGEX); 
}

有人可以解释我为什么吗? 我该如何解决这个问题?

我正在开发MS Visual Studio 2015企业版14。

1 个答案:

答案 0 :(得分:3)

问题在于正则表达式需要大量的回溯步骤才能完成。如果字符串以某种方式分隔,则不鼓励使用.(匹配任何字符而不是换行符)。

我建议使用

const static std::string REGEX_STR("^[^=]+=[^" + sep + "]+(" + sep + "[^" + sep + "]+)*$");

;作为分隔符传递,它看起来像^[^=]+=[^;]+(;[^;]+)*$,并且将比^.{1,}=.{1,}(;.{1,})*$(18步)更有效地解析字符串(11个步骤)。想象一下,使用更多的数据,很明显catastrophic backtracking会更快发生。