跳到主要内容

1.3 什么是正则表达式?

我们已经知道了正则表达式的用途以及使用的方式和场景。那么到底什么是正则表达式?正则表达式是怎么来的呢?

什么是正则表达式?

正则表达式并不是一种完备的编程语言,它甚至算不上是一种能够直接安装并运行的程序。理准确地说,正则表达式是内置于其他语言或软件产品里的“迷你”语言。

正则表达式的定义

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。[1]^{[1]}

正则表达式的历史

正则表达式起源于 1951 年,当时数学家斯蒂芬·科尔·克莱尼(Stephen Cole Kleene)使用称为常规事件的数学符号描述了正则语言。这些出现在理论计算机科学、自动机理论(计算模型)的子领域以及形式语言的描述和分类中。其他早期的模式匹配实现包括 SNOBOL 语言,它不使用正则表达式,而是使用自己的模式匹配结构。

正则表达式从 1968 年开始以两种用途流行起来:文本编辑器中的模式匹配和编译器中的词法分析。 正则表达式在程序形式中的首次出现是当肯·汤普逊(Ken Thompson)将 Kleene 的符号构建到编辑器 QED 中作为匹配文本文件中模式的一种手段时。为了速度,汤普逊在 Compatible Time-Sharing System 上通过即时编译 (JIT) 与 IBM 7094 代码实现正则表达式匹配,这是 JIT 编译的一个重要早期示例。 后来他在 Unix 编辑器 ed 中添加了这个功能,最终导致流行的搜索工具 grep 使用正则表达式。大约在 汤普逊开发 QED 的同时,包括道格拉斯·T·罗斯(Douglas T. Ross)在内的一组研究人员实现了一个基于正则表达式的工具,用于编译器设计中的词法分析。

这些原始形式的正则表达式的许多变体在 1970 年代贝尔实验室的 Unix 程序中使用,包括 vi、lex、sed、AWK 和 expr,以及 Emacs 等其他程序。正则表达式随后被广泛的程序采用,这些早期形式于 1992 年在 POSIX.2 标准中标准化。

在 1980 年代,更复杂的正则表达式出现在 Perl 中,它最初源自亨利·斯宾塞(Henry Spencer) 编写的正则表达式库,后来他为 Tcl 编写了高级正则表达式的实现。 Tcl 库是具有改进的性能特征的混合 NFA/DFA 实现。PostgreSQL 数据库的正则表达式就是使用的采用斯宾塞的 Tcl 正则表达式库。Perl 后来扩展了斯宾塞的原始库以添加许多新功能。 设计 Raku(以前称为 Perl 6)的部分工作是改进 Perl 的正则表达式集成,并增加它们的范围和能力以允许定义解析表达式语法。 结果是一种称为 Raku 规则的迷你语言,用于定义 Raku 语法并为该语言的程序员提供工具。这些规则保留了 Perl 5.x 正则表达式的现有特性,但也允许通过子规则以 BNF 样式定义递归下降解析器。

从 1997 年开始,菲力普·哈泽尔(Philip Hazel)开发了 PCRE(Perl Compatible Regular Expressions),它试图模仿 Perl 的正则表达式功能,并被包括 PHP 和 Apache HTTP Server 在内的许多现代工具使用。

今天,正则表达式在编程语言、文本处理程序(尤其是词法分析器)、高级文本编辑器和其他一些程序中得到广泛支持。正则表达式支持是许多编程语言(包括 Java 和 Python)标准库的一部分,并且内置于其他语言(包括 Perl 和 ECMAScript)的语法中。正则表达式功能的实现通常称为正则表达式引擎,并且有许多库可供重用。在 2010 年代后期,几家公司开始提供与 CPU 实现相比更快的 PCRE 兼容正则表达式引擎的硬件、FPGA、 GPU 实现等。[2]^{[2]}

该内容转载自 互联网
如有侵权,请联系我删除。
版权归原作者所有,再次转载请遵守原作者相关协议。