编译正则表达式时会发生什么?

时间:2011-04-20 17:08:07

标签: regex language-agnostic

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

我想那里有一个有限状态的自动机,但你必须比我更清楚。

2 个答案:

答案 0 :(得分:5)

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

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

  1. 创建一个正则表达式对象(实现为虚拟机),类似于Python和re2。
  2. 创建正则表达式对象,并将其虚拟机操作码即时编译为内存中的IL指令。
  3. 创建正则表达式对象,并将其虚拟机操作码作为IL指令编译到磁盘。
  4. 你提到了对算法的兴趣。看看Russ Cox关于两种方法的优秀文章:

答案 1 :(得分:1)

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