深度分析正则(pcre)最大回溯/递归限制

yizhihongxing

深度分析正则(pcre)最大回溯/递归限制

正则表达式是一种描述字符模式的工具,由于其强大的表达能力和广泛的应用场景,成为了数据分析、文本挖掘等领域的重要工具。正则表达式引擎可以进行的匹配步骤是有限的,当模式中包含递归或回溯时,引擎可能会一直重复步骤,导致匹配效率降低,甚至出现崩溃等问题。

为了避免这种状况,正则表达式引擎实现了最大回溯/递归限制,即“PCRE recursion limit”和“PCRE backtracking limit”参数。

PCRE为Perl Compatible Regular Expressions(Perl兼容正则表达式),是一个库,由C语言编写。

PCRE Recursion Limit

PCRE Recursion Limit用来限制正则表达式中递归调用的深度,避免无限递归,消耗过多的系统资源并导致应用程序崩溃。缺省值是100000,也就是说当递归调用次数达到100000时程序会停止运行。

PCRE回溯限制

PCRE Backtracking limit用来限制正则表达式的回溯操作的深度,避免重复回溯而导致性能问题和运行程序崩溃。缺省值是1000000,也就是达到1000000次回溯时程序会停止运行。

当超过限制时,PCRE将会返回一个错误:PCRE_ERROR_RECURSIONLIMIT 或 PCRE_ERROR_BACKTRACKLIMIT。通过在调用编译/匹配函数时提供合适的限制,可以避免由于正则表达式中过多的递归或过多的回溯,导致应用程序无响应或崩溃等问题。

示例

假设我们要查找字符串“a”重复出现的字符串,“a”重复的次数不确定,可以使用“/a+ /”正则表达式。

当a的数目比较小的时候,该正则表达式可以很快的匹配成功。然而,当a的数目变大时,匹配就会花费更多的时间。这是因为正则表达式引擎在执行回溯过程中,不断的试图寻找更多的匹配结果。这就是“回溯/递归”错误/问题。

可以通过限制匹配的递归深度和回溯深度来解决这个问题。

下面是一个具体的例子。我们的目标是在由三组 a 组成,中间由连字符 - 分割的字符串中查找匹配串。

$input = 'aaa-bbbbb-aaaaaaa';
echo preg_match('/((a+)+)-((a+)+)-((a+)+)/', $input);  // 输出1

//增加限制
echo preg_match('/((a+){1,' . ini_get("pcre.recursion_limit") . '})-((a+){1,' . ini_get("pcre.recursion_limit") . '})-((a+){1,' . ini_get("pcre.recursion_limit") . '})/', $input); // 输出1

//触发回溯限制
$input = 'aaaaaaaaaaaaaaaaaaaaaa-x';
echo preg_match('/((a+)+)-x/', $input); // 出现回溯错误

//增加限制
echo preg_match('/((a+){1,' . ini_get("pcre.backtrack_limit") . '})+-x/', $input); // 处理正常

上面的这个例子是PHP实现的,但其他语言的实现也会有同样的问题和限制。在编写正则表达式时,应该谨慎地使用回溯和递归,以避免漏洞和性能问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度分析正则(pcre)最大回溯/递归限制 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 前端笔记——如何控制表单控件中的disabled

    前端笔记——如何控制表单控件中的disabled的完整攻略 在前端开发中,我们经常需要控制表单控件的状态,例如禁用启用。本攻略将介绍如何控制表单控件中的disabled属性,并提供两个示例说明。 步骤一:表单控件 首先,我们需要获取要控制的表单控件。可以使用以下方式获取表单控件: const input = document(‘myInput’); 在上面的…

    other 2023年5月6日
    00
  • Android使用自定义PageTransformer实现个性的ViewPager动画切换效果

    Android使用自定义PageTransformer实现个性的ViewPager动画切换效果攻略 在Android开发中,ViewPager是一个常用的控件,用于实现页面切换效果。通过自定义PageTransformer,我们可以实现个性化的ViewPager动画切换效果。下面是详细的攻略,包含两个示例说明。 步骤一:创建自定义的PageTransform…

    other 2023年8月20日
    00
  • win8系统使用360浏览器浏览网页提示此网站的某个加载项运行失败的原因及解决方法

    问题描述: 在win8系统下使用360浏览器浏览网页时可能会遇到提示“此网站的某个加载项运行失败”的问题,这种情况下会导致部分网页无法正常加载。那么,这个问题的原因是什么,如何解决呢? 解决步骤: Step 1:检查360浏览器及其插件是否最新版本 首先需要确保你的360浏览器及其插件是最新版本。在360浏览器的设置界面中,可以找到“插件管理”选项,在这里可…

    other 2023年6月25日
    00
  • rust生命周期详解

    Rust 生命周期详解 什么是Rust生命周期? Rust生命周期描述的是变量或引用在代码中存在的有效时间。它们指定了变量或引用将在什么时候被创建和销毁,在整个程序中保持稳定状态。 Rust语言中生命周期的声明方式采用了单引号’。 例如,在以下代码中,参数x的生命周期通过’a指定: fn func<‘a>(x: &’a i32) { //…

    other 2023年6月27日
    00
  • 关于不懂Chromedriver如何配置环境变量问题解决方法

    关于不懂Chromedriver如何配置环境变量问题解决方法 什么是Chromedriver Chromedriver是一个用于连接Google Chrome浏览器的工具,可以在Python等编程语言中调用它,实现自动化测试等功能。 为什么要配置Chromedriver环境变量 在使用Selenium进行Python自动化测试的时候,我们需要用到Chrome…

    other 2023年6月27日
    00
  • androideasybarrage实现轻量级弹幕效果

    AndroidEasyBarrage实现轻量级弹幕效果 AndroidEasyBarrage是一款轻量级的弹幕效果库,它可以帮助开发者快速实现弹幕效果。在本文中,我们将详细讲解AndroidEasyBarrage使用方法,包括两个示例说明。 步骤 添加依赖 在使用AndroidEasyBarrage之前,需要在项目中添加依赖。可以在项目的build.grad…

    other 2023年5月8日
    00
  • .net反编译的九款神器

    .NET反编译是一种将已编译的.NET程序集转换回其源代码的过程。这种技术可以帮助开发人员理解和修改现有的.NET程序集。以下是.NET编译的九款神器的完整攻略: dnSpy dnSpy是一免费的.NET反编译器,可以反编译.NET程序集并查看其源代码。它还支持调试反编译的代码,并提供了一些其他有用的功能,如查看程序集的元数据和IL代码。以下是使用dnSpy…

    other 2023年5月7日
    00
  • 什么是增强现实?

    增强现实(Augmented Reality, AR)是一种将虚拟对象和现实世界融合的技术。它可以通过投影、头戴式显示器和移动设备等方式实现。在增强现实的应用程序中,虚拟的三维对象会覆盖在现实世界中的实体物体上,使整个场景更具沉浸感。 下面是使用Unity3D引擎来创建增强现实应用程序的完整攻略: 步骤一:安装开发环境 首先,需要安装Unity3D开发环境。…

    其他 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部