我们都知道你可以将你常用的正则表达式编译成性能非常好的东西。但这幕巫术背后发生了什么呢?
我想那里有一个有限状态的自动机,但你必须比我更清楚。
答案 0 :(得分:5)
正则表达式编译的细节因实现而异。例如,Python或re2中的编译只是创建正则表达式对象的实例。该对象的状态机可以被建模为图形或虚拟机。如果没有编译(例如:RE.match(expression, input)
),每次调用match
时都会在后台创建一个新的正则表达式对象。如果您要多次使用表达式,这是不必要的工作。
在C#中,three things can happen when you compile之一:
你提到了对算法的兴趣。看看Russ Cox关于两种方法的优秀文章:
答案 1 :(得分:1)
编译正则表达式类似于编译Java或Python代码;正则表达式转换为RE引擎然后解释的中间表示,以便对字符串执行适当的操作。