【发布时间】:2015-04-09 08:27:51
【问题描述】:
我想使用以下正则表达式将字符串与使用 std::regex 的 C++11 匹配:
([^;]|'[^']*')*
我想要实现的是:我想匹配除分号之外的所有字符,但是,如果用撇号括起来,分号应该被忽略(这表示一个字符串)。尝试应用正则表达式时出现堆栈溢出。我意识到问题是由excessive backtracking 引起的。不幸的是,我不知道如何摆脱这个问题。如何重写表达式以使其不会导致大量回溯?
带有虚拟文本的最小代码示例:
#include <regex>
#include <string>
int main()
{
std::string str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut suscipit enim. Praesent varius purus ac sem vulputate pulvinar. Mauris scelerisque arcu tortor, at bibendum dui rhoncus ut. Nunc dictum malesuada condimentum. Mauris ornare nunc eget efficitur tempor. Morbi ex nibh, consectetur vitae bibendum id, bibendum varius purus. Proin finibus quam vel ornare molestie. Mauris condimentum nisi efficitur, fringilla massa ut, commodo diam. Mauris lobortis laoreet magna sed commodo. Donec faucibus lectus placerat ex pulvinar interdum.";
std::regex rgx("([^;]|'[^']*')*");
std::regex_match(std::begin(str), std::end(str), rgx); // Stack overflow!
return 0;
}
我正在使用 Visual Studio 2012。
【问题讨论】:
-
不太确定问题出在哪里,但您可以尝试不捕获
(?:[^;]|'[^']*')*,并稍微调整正则表达式(?:''|'[^']+'|[^;])* -
@YOU:我已经尝试过非捕获分组,没有成功。你建议的小调整也没有用。
-
用
+而不是*怎么样?它改变了正则表达式,并且不会匹配空白字符串,但你可以试试。 -
@YOU 还是会导致栈溢出。
-
你可以试试RE2。
标签: c++ regex c++11 stack-overflow backtracking