我编写了一个小函数来通过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。
答案 0 :(得分:3)
问题在于正则表达式需要大量的回溯步骤才能完成。如果字符串以某种方式分隔,则不鼓励使用.
(匹配任何字符而不是换行符)。
我建议使用
const static std::string REGEX_STR("^[^=]+=[^" + sep + "]+(" + sep + "[^" + sep + "]+)*$");
将;
作为分隔符传递,它看起来像^[^=]+=[^;]+(;[^;]+)*$
,并且将比^.{1,}=.{1,}(;.{1,})*$
(18步)更有效地解析字符串(11个步骤)。想象一下,使用更多的数据,很明显catastrophic backtracking会更快发生。