【问题标题】:What happens when you compile regular expressions?编译正则表达式时会发生什么?
【发布时间】:2011-08-09 16:39:11
【问题描述】:

我们都知道,您可以将常用的正则表达式编译成性能非常好的东西。但幕后究竟发生了什么巫术?

我猜想那里建立了一个有限状态自动机,但你一定比我更清楚。

【问题讨论】:

  • “在那里建立了一个有限状态自动机”。正确的。你还想知道什么?真的就是这么简单。
  • @S.Lott:嗯,我认为构建它们很复杂。您可以发布例如众所周知的算法或其他内容。当有人实现 RE 库时,作案手法是什么?
  • 考虑到捕获组和扩展的 RE 功能,为实现正则表达式而生成的代码可能会比有限状态自动机复杂一些。
  • 知名算法?您希望我们为您查看哪个 RE 库?您确实拥有与我们其他人相同的资源访问权限。此外,许多高级 CS 站点都有关于 RE 操作的教程。我不清楚你想知道什么你还不知道。你已经描述得很完整了。
  • 此外,要了解更多细节需要放弃与语言无关的标签。

标签: regex language-agnostic


【解决方案1】:

正则表达式编译的细节因实现而异。例如,Pythonre2 中的编译只是创建一个正则表达式对象的实例。该对象的状态机可以建模为图形或虚拟机。如果没有编译(例如:RE.match(expression, input)),每次调用match 时都会在后台创建一个新的正则表达式对象。如果您要多次使用一个表达式,这是不必要的工作。

在 C# 中,three things can happen when you compile 之一:

  1. 创建一个正则表达式对象(实现为虚拟机)类似于 Python 和 re2。
  2. 创建正则表达式对象,并将其虚拟机操作码即时编译为内存中的 IL 指令。
  3. 创建正则表达式对象,并将其虚拟机操作码作为 IL 指令编译到磁盘。

您提到了对算法的兴趣。看看 Russ Cox 关于两种方法的优秀文章:

【讨论】:

  • 一个很好的答案,但我希望接受这个不会阻止其他人回答,如果他们有任何很酷的东西要分享:)
【解决方案2】:

编译正则表达式类似于编译 Java 或 Python 代码;正则表达式被转换为 RE 引擎随后解释的中间表示,以便对字符串执行适当的操作。

【讨论】:

  • 这就是你认为它必须工作的方式。但是,曾几何时,我曾经将正则表达式直接编译为 Z80 机器码——当然,今天也可以这样做(当然,这会失去机器独立性)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多