← 最新论文
💻 computer science

Towards Efficient Matching of Regexes with Backreferences using Register Set Automata (Technical Report)

该论文提出了一种名为寄存器集自动机(RSA)的新模型,通过将带反向引用的正则表达式转换为确定性 RSA,实现了线性或二次时间复杂度的高效匹配,显著提升了现有匹配器的鲁棒性,并证明了该模型的空性问题可判定且其表达能力与其他数据词自动机模型不可比。

原作者: Vojtěch Havlena, Lukáš Holík, Ondřej Lengál, Jan Vašák, Sabína Gulčíková

发布于 2026-04-16
📖 1 分钟阅读☕ 轻松阅读

原作者: Vojtěch Havlena, Lukáš Holík, Ondřej Lengál, Jan Vašák, Sabína Gulčíková

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

这篇论文主要解决了一个计算机领域的“老难题”:如何快速、安全地匹配带有“回溯引用”的正则表达式。

为了让你轻松理解,我们可以把整个过程想象成**“在图书馆找书”“防止图书馆被捣乱”**的故事。

1. 背景:什么是正则表达式和“回溯引用”?

想象你是一位图书管理员(计算机程序),手里有一本**“找书规则手册”(这就是正则表达式**)。

  • 普通规则:比如“找所有红色的书”。这很简单,你扫一眼书架,看到红色的就拿走。
  • 带“回溯引用”的规则:这就像规则里写着:“先找一本红色的书,记住它的名字;然后找一本蓝色的书;最后,必须再找一本名字和第一本完全一样的书。”

这种“记住之前的内容,后面再对照”的功能,就是回溯引用(Backreferences)。它在处理复杂数据(比如检查 XML 文件、验证用户输入)时非常有用。

2. 问题:为什么现在的系统会“崩溃”?

目前,大多数图书管理员(现有的正则匹配器,如 PCRE2、Python 的 re 等)在处理这种“先记后对”的规则时,使用的是**“笨办法”,也就是回溯算法(Backtracking)**。

比喻:迷宫探险
想象你要在一个巨大的迷宫里找出口。

  • 笨办法(回溯):你走到一个岔路口,随便选一条路走。如果走不通,你就退回到岔路口,换另一条路再试。如果还是不行,再退回去……
  • 灾难现场(ReDoS 攻击):如果迷宫设计得很狡猾(比如有很多看似能走其实走不通的死胡同),或者有人故意给你一张画满死胡同的地图(恶意输入),管理员就会陷入**“无限循环”。他会在岔路口进进出出几百万次,最后累死在原地,导致整个图书馆(服务器)瘫痪,谁也进不来了。这就是“正则表达式拒绝服务攻击”(ReDoS)**。

现状:为了追求速度,很多现代系统(如 Google 的 RE2)直接禁止使用这种“回溯引用”功能,因为没人能写出一个既快又不会卡死的算法来处理它。

3. 解决方案: register set automata (RSA) —— “超级记忆库”

这篇论文的作者提出了一种新的“找书策略”,叫做寄存器集自动机(Register Set Automata, RSA)

比喻:从“单本笔记”升级为“智能清单”

  • 旧方法(普通寄存器自动机)
    以前的管理员手里只有一个小记事本。他只能记下一个名字。

    • 规则:“记住第一个名字,后面再找一样的。”
    • 如果规则是:“记住第一个名字,再记住第二个名字,最后找跟第一个一样的……"
    • 小记事本不够用了!他必须擦掉第一个记第二个,或者疯狂地在脑子里模拟“如果当时记的是 A 会怎样,如果是 B 会怎样”。这就是导致卡死的原因。
  • 新方法(寄存器集自动机 RSA)
    作者给管理员换了一个**“超级智能清单”**(Set Register)。

    • 这个清单不是记“一个名字”,而是可以同时记下“所有见过的名字”
    • 操作
      1. 添加:每看到一个新名字,直接扔进清单里(清单自动去重)。
      2. 合并:如果两个清单要合并,直接倒在一起。
      3. 检查:要检查“这个名字在不在清单里?”,只要看一眼清单就行,不用回头重走。

核心突破
作者设计了一种算法,能把那些复杂的、带有“回溯引用”的规则,自动翻译成这种“超级智能清单”的指令。

  • 确定性:这个新系统不需要“猜”或者“退回去重走”。它像一条笔直的高速公路,每读一个字符,只做一次检查
  • 速度:无论输入多长,它都能在线性时间内搞定(比如 100 个字符,就花 100 步;100 万个字符,就花 100 万步,绝不会变成 100 万步的平方)。

4. 实验结果:真的有用吗?

作者写了一个原型工具(叫 rsamatch),并拿它和现有的顶级工具(如 PCRE2, grep, Python re 等)做比赛。

  • 场景:给它们一些精心设计的“恶意地图”(ReDoS 攻击向量),这些地图会让旧工具卡死几秒甚至几分钟。
  • 结果
    • 旧工具:大部分直接超时(超过 100 秒),或者跑了几万步还没找到答案。
    • 新工具(rsamatch):几乎全部在1 秒以内搞定,而且非常稳定。
    • 结论:新方法不仅快,而且极其稳健,彻底消除了被恶意输入卡死的风险。

5. 理论上的“副作用”

虽然新方法很快,但作者也诚实地指出,这种“超级清单”在数学上变得更复杂了。

  • 代价:如果要证明这个清单里“有没有书”(空集问题),计算难度比以前的方法高了很多(从“中等难度”变成了“超级难度”,虽然理论上还是可解的,但计算量很大)。
  • 权衡:但在实际应用中,我们更关心“匹配速度快不快”和“会不会被卡死”,而不是“证明它有没有书”。所以,这个代价是值得的。

总结

这篇论文就像给图书馆管理员发了一套**“防暴盾牌”和“超级清单”**:

  1. 以前:遇到复杂规则就靠“猜”,容易被坏人(恶意输入)绕晕,导致服务器崩溃。
  2. 现在:用“超级清单”把所有可能性一次性记下来,只走一遍就能完成匹配。
  3. 效果:速度快如闪电,且绝对安全,不再怕“拒绝服务攻击”。

这对于保护互联网安全(防止网站被正则表达式攻击搞挂)有着非常重要的意义。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →