On the Complexity of the Matching Problem of Regular Expressions with Backreferences
本文通过证明基于强指数时间假设和三角形检测假设的条件下界,确立了带反向引用的正则表达式匹配的细粒度计算复杂度,同时提出了针对单次使用反向引用的改进算法。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
以下是论文《带后向引用的正则表达式匹配问题复杂度》的通俗解释,使用类比进行翻译。
宏观图景:"Regex"交通堵塞
想象你是一家俱乐部(计算机系统)的保安。你有一份规则列表(一个正则表达式),用来决定谁能进入。
- 简单规则:“只允许穿红衬衫的人。”这很容易检查。你看一眼衬衫,说“红色?是的,进来。”无论队伍是 10 人还是 10,000 人,检查所需的时间都是一样的。
- 问题(ReDoS):有时,黑客会精心策划一条特定的人员队伍,诱骗保安做大量不必要的无用功。保安不再检查一个人就继续下一个,而是开始检查 A 人,然后 B 人,然后又是 A 人,接着 C 人,再回到 A 人……直到保安因精疲力竭而崩溃。这被称为拒绝服务(ReDoS)攻击。
在现实世界中,这曾导致 Stack Overflow 和 Cloudflare 等大型网站崩溃。论文指出,即使是“二次方”级别的缓慢(检查 100 人需要 10,000 步),也足以让系统崩溃。
反派角色:“后向引用”
标准规则很简单。但现代"Regex"引擎拥有一个超级强大的功能,称为后向引用。
类比:
想象一条规则说:“找到一个词,记住它,然后确保完全相同的词稍后再次出现。”
- 例子:“找到一个词,称之为'X'。然后,再次找到'X'。”
- 如果输入是
apple ... apple,则匹配成功。 - 如果输入是
apple ... banana,则匹配失败。
这个功能对程序员来说极其有用,但它让“保安”的工作变得困难得多。保安必须记住之前看到的内容,并不断将其与当前看到的内容进行比较。论文问道:我们能否构建一个足够快的保安,在处理这些复杂规则时不会感到疲惫?
论文发现:好的、坏的和丑的
作者调查了解决这些匹配问题究竟有多难。他们将问题分为两个方面:难度(为什么困难)和算法(如何解决)。
1. 坏消息:某些规则无法加速
论文证明,对于某些类型的复杂规则,没有任何“灵丹妙药”能让它们变快。
- “三角形”问题:他们表明,如果你有一条使用两个变量的规则(例如记住两个不同的词并在稍后检查它们),解决它就像在巨大的社交网络图中寻找三角形一样困难。如果你能快速解决规则问题,你就能快速解决图论问题。由于图论专家认为图论问题本质上就是缓慢的,那么规则问题也必然是缓慢的。
- “正交向量”问题:对于拥有更多变量的规则,他们证明了所需时间会随着变量数量的增加呈指数级增长。这就像试图在锁中找到特定的钥匙组合;你拥有的钥匙越多,暴力破解就越不可能快速完成。
要点:如果你的规则太复杂(使用了太多“记住这个”的功能),你就无法为它构建一个快速的引擎。你总会撞上一堵墙。
2. 好消息:简单情况的“近线性”解决方案
然而,论文发现了一个甜蜜点。他们专注于一种特定且常见的规则类型:
- "ABCBD"模式:“找到一个词(A),然后一个词(B),然后一个词(C),然后再次找到完全相同的词 B,最后是一个词(D)。”
- 现实例子:“找到一个用户名,然后一个密码,然后一条消息,然后再次找到相同的用户名,最后是一个签名。”
作者发现,虽然这看起来很棘手,但可以非常高效地解决。
- 旧方法:以前的方法就像在图书馆里检查每一种可能的组合,这需要 的时间(二次方)。如果书有 1,000 页,就需要 1,000,000 步。
- 新方法:作者构建了一种新算法,大约需要 的时间。
- 类比:想象图书馆使用了一个神奇的索引系统(利用后缀树和因子森林)。保安不需要阅读每一页,而是可以直接跳转到相关部分。如果书有 1,000 页,新方法大约只需要 10,000 步(甚至更少),这是一个巨大的改进。
新算法如何工作(“魔法技巧”)
为了实现这种速度,作者在论文中描述了他们使用的几种巧妙技术:
- 后缀树(地图):他们构建了输入字符串的巨型地图。这张地图显示了字符串的每一个可能的结尾。它帮助保安瞬间看到:“哦,这个词'B'出现在这里,也出现在那里。”
- 轻重路径分解( Sorting Hat):他们将地图分为“重”路径(非常常见的路径)和“轻”路径(罕见的路径)。他们只在罕见路径上进行繁重的处理,从而节省时间。
- 周期性(节奏):他们注意到,当一个词重复出现时(如"B...B"),字符串通常具有某种节奏或模式。他们利用数学来预测这些模式,而不是检查每一个字母。
- 因子森林(索引):这是一种数据结构,充当超快索引,允许保安以恒定时间检查一段文本是否符合规则,无论文本有多长。
结论总结
- 我们能阻止所有 ReDoS 攻击吗? 不能。如果规则太复杂(太多的“记住这个”变量),数学上已证明它是缓慢的。
- 我们能修复最常见的复杂规则吗? 可以!对于规则记住一个词并在稍后检查一次的具体情况("ABCBD"模式),作者创建了一种新引擎,其速度几乎与简单规则一样快。
- 这为什么重要? 它告诉软件工程师:“不要使用太多的后向引用,否则你会变慢。但如果你以这种特定且常见的方式使用它们,现在你可以使用我们的新方法来保持系统既安全又快速。”
这篇论文本质上在沙地上划了一条线:这里是速度限制无法被打破的地方,而这里是我们找到加速方法的地方。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。