正则表达式引擎有那些?编程语言使用的是那种引擎

151 阅读3分钟

正则表达式引擎主要可以分为两大类:确定性有穷自动机(DFA)和非确定性有穷自动机(NFA)。在这两大类的基础上,又产生了多种变体,导致目前的主流正则引擎主要分为三类:

1、DFA(Deterministic Finite Automaton)引擎:

DFA引擎在线性时间状态下执行,因为它们不要求回溯(并因此它们永远不测试相同的字符两次)。

DFA引擎可以确保匹配最长的可能的字符串。

但是,因为DFA引擎只包含有限的状态,所以它不能匹配具有反向引用的模式,并且因为它不构造显示扩展,所以它不可以捕获子表达式。

目前使用DFA引擎的程序主要有:awk(大多数版本)、egrep(大多数版本)、flex、lex、MySQL、Procmail等。

2、传统型NFA(Nondeterministic Finite Automaton)引擎:

传统的NFA引擎运行所谓的“贪婪的”匹配回溯算法,以指定顺序测试正则表达式的所有可能的扩展并接受第一个匹配项。

因为传统的NFA构造正则表达式的特定扩展以获得成功的匹配,所以它可以捕获子表达式匹配和匹配的反向引用。

但是,因为传统的NFA回溯,所以它可以访问完全相同的状态多次(如果通过不同的路径到达该状态)。因此,在最坏情况下,它的执行速度可能非常慢。

目前使用传统型NFA引擎的程序主要有:GNU Emacs、Java、grep(大多数版本)、less、more、.NET语言、PCRE library、Perl、PHP(所有三套正则库)、Python、Ruby、sed(大多数版本)、vi等。

3、POSIX NFA引擎:

POSIX NFA引擎与传统的NFA引擎类似,但在它们可以确保已找到了可能的最长的匹配之前,它们将继续回溯。

因此,POSIX NFA引擎的速度慢于传统的NFA引擎。 目前使用POSIX NFA引擎的程序主要有:mawk、Mortice Kern Systems’ utilities、GNU Emacs(使用时可以明确指定)。

4、其他

还有一些编程语言或工具使用DFA/NFA混合的引擎,如GNU awk、GNU grep/egrep、Tcl等。

对于编程语言中使用的正则表达式引擎,这通常取决于该语言的具体实现和选择。例如:

Perl:Perl的正则表达式引擎具有强大的功能和灵活性。

PCRE(Perl Compatible Regular Expressions):PCRE是一个库,提供了Perl兼容的正则表达式功能,可以在许多编程语言中使用,如PHP、Python等。

Java:Java内置了正则表达式引擎,可以通过java.util.regex包使用。

Python:Python的re模块提供了正则表达式引擎,可以进行匹配和替换操作。

JavaScript:JavaScript内置了正则表达式引擎,可以通过RegExp对象使用。

.NET:.NET框架提供了强大的正则表达式引擎,可以在C#、VB.NET等语言中使用。