当前位置: 首页 > 知识库问答 >
问题:

正则表达式中回溯引起的堆栈溢出

万俟承望
2023-03-14
([^;]|'[^']*')*
#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;
}

共有1个答案

令狐俊风
2023-03-14

如果您将regex语法切换到基本的posix而不是deafult ECMAscript,它将不再溢出:

std::regex rgx("([^;]|'[^']*')*", std::regex_constants::basic);

我用MSVC2013进行了测试,它工作了。不幸的是,它也不符合您的期望,正如这个小变体所展示的:

...
std::smatch cm;
std::regex_search(str, cm, rgx, std::regex_constants::match_any | std::regex_constants::match_continuous | std::regex_constants::match_not_null); // No overflow!
for (int i = 0; i < cm.size(); i++)
    std::cout << "Found:" << cm[i];  // but no result is printed out. 

如果选择std::regex_constants::extended选项,堆栈溢出会再次出现。

#include <iostream>
#include <boost/regex.hpp>  // instead of <regex>
#include <string>
                            // use the boost alternative to std
using namespace boost::regex_constants;  
using boost::regex; using boost::smatch; using boost::regex_search;

int main()
{
    std::string str = "your very long string..." ;
    regex rgx("([^;]|'[^']*')*", extended | nosubs);
    smatch cm;
    //regex_match(str, cm, rgx, regex_constants:: match_continuous | match_not_null); // Stack overflow!
    regex_search(str, cm, rgx, match_continuous | match_not_null); 
    for (int i = 0; i < cm.size(); i++)
        std::cout << "Found:" << cm[i];
    return 0;
}
 类似资料:
  • 我找不到堆栈溢出的来源,但似乎是外部的循环造成的。 提前道谢!

  • 我正在将一些较旧的Boost regex代码转换为C++11的过程中,我在一个测试用例中偶然发现了一个问题。下面是一个使用std::regex导致堆栈溢出异常的场景,但使用boost::regex可以很好地工作。我没有更改正则表达式模式,并且已经验证了该模式是我想要的。似乎是这个特定的字符串输入片段导致了堆栈溢出。使用VS2012,x64调试生成:

  • 问题内容: 下面的表达式: 运行编译的.Jar文件时,覆盖匹配的缓冲区。 匹配的字符串可以类似于: 这是一条垃圾线 #ifdef FEATURE #endif // FEATURE的结尾 这是一条垃圾线 #ifdef功能 这是一条应该匹配的垃圾线:HOLasduiqwhei&//功能fjfefj #endif // h #endif功能 这是一条垃圾线 因此,粗体字符串应匹配。错误如下: 欢迎采取

  • 问题内容: 该类的标准实现使用递归来实现多种形式的正则表达式(例如,某些运算符,替换)。 这种方法会导致输入字符串超过(相对较小)长度(可能不超过1,000个字符)的堆栈溢出问题,具体取决于所涉及的正则表达式。 一个典型的例子是以下正则表达式,它使用交替从周围的XML字符串中提取可能的多行元素(名为),该元素已经提供了: 上面的正则表达式与该方法一起使用,以读取“数据”捕获组并按预期工作,直到提供

  • 本文向大家介绍正则表达式学习教程之回溯引用backreference详解,包括了正则表达式学习教程之回溯引用backreference详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了正则表达式回溯引用backreference。分享给大家供大家参考,具体如下: 在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?