正则表达式(通常缩写为regex )是文本内模式匹配的强大工具。例如,表达式
\d*\.?\d+
将匹配正数,例如 1.1 或 12。如果精心设计和测试,正则表达式可以在关键任务软件中使用。然而,它们的强大功能也伴随着风险:设计小的正则表达式是可能的,即使在很小的字符串上运行,这些正则表达式的运行成本也非常昂贵。
更复杂的是,有多种正则表达式引擎,它们的语法和实现各不相同。让我考虑一下 Linux 下 C++ 语言使用的正则表达式引擎 ( libgc++ )。
考虑以下程序。它使用字符串“每个人都爱露西”。和 da regex 模式(.*+s}}@w 。我不太确定这个模式应该做什么,但它被引擎接受。然后程序使用std::regex_search来查找该模式的匹配项在字符串中,将潜在匹配存储在std::smatch对象中,并输出是否找到匹配。
#包含<iostream> #包含<正则表达式> int主( ) { std :: string text = “每个人都爱露西。 ” ; std ::正则表达式模式( R"( .*+s}}@w )" ) ; // 执行正则表达式搜索 std :: smatch 匹配; bool找到= std :: regex_search (文本,匹配,模式) ; std :: cout << “正则表达式搜索结果: ” << (找到了? "找到匹配项" : "没有匹配项" ) << std :: endl ; 返回0 ; }
使用 GCC 12 和最新的 Linux 服务器,该程序运行大约需要 7 分钟。
换句话说,错误的正则表达式可能会使您的系统崩溃。这不仅仅是理论上的, Cloudflare 公司在 2019 年由于糟糕的正则表达式而遭受了严重的停机。
谨慎使用正则表达式。
原文: https://lemire.me/blog/2025/01/25/regular-expressions-can-blow-up/