正则表达式的历史与几大流派

一、介绍


正则表达式(英语:Regular Expression,常简写为 regex、regexp 或 RE )

此处的 Regular 即是规则、规律的意思,Regular Expression 即“描述某种规则的表达式”之意。

二、历史


最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。

1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器 QED,随后是 Unix 上的编辑器 ed,并最终引入 grep。自此以后,正则表达式被广泛地应用于各种 Unix 或类 Unix 系统的工具中。此时出现了POSIX 规范的正则表达式

Perl 正则表达式源自于 Henry Spencer 于1986年1月19日发布的 regex。它后来演化成了 PCRE(Perl 兼容正则表达式,Perl Compatible Regular Expressions),一个由 Philip Hazel 于1997年夏天开始编写开发的,用 C 编写的,为很多现代工具所使用的库。 PCRE 的语法比 POSIX 正则表达式和许多其他正则表达式库都强大和灵活。许多著名的开源程序(例如 Apache 和 Nginx HTTP 服务器以及 PHP 和 R 脚本语言)都包含 PCRE 库。

编程语言之间关于正则表达式的集成,虽开发进展得很差,但也在逐步推行。我所接触过的,Python 中的正则比较完善,JavaScript 中的正则相对比较弱。

三、规范/流派


1、POSIX 规范的正则表达式

POSIX( Portable Operating System Interface for unix )规范又可分为两种流派(flavor):

  • 基本的正则表达式(Basic Regular Expression,又叫 Basic RegEx,简称 BRE
  • 扩展的正则表达式(Extended Regular Expression,又叫 Extended RegEx,简称 ERE

应用范围:

  • Unix/Linux 下的工具
  • 一些数据库系统
(1)BRE

在 Linux/Unix 常用工具中,grep、vi、sed 都属于 BRE 这一派。

后来 GNU 也对 BRE 做了扩展。这样,GNU 的 grep 等工具虽然名义上属于 BRE 流,但更确切的名称是 GNU BRE

(2)ERE

注意:虽然 BRE 名为“基本”而 ERE 名为“扩展”,但 ERE 并不要求兼容 BRE 的语法,而是自成一体。

在 Linux/Unix 常用工具中,grep -E、sed -r、awk 都属于 ERE 这一派。

后来 GNU 也对 ERE 做了扩展。这样,GNU 的 egrep 等工具虽然名义上属于 ERE 流,但更确切的名称是 GNU ERE

(3)BRE 和 ERE 的区别

在 GNU 的拓展后,现在的 BRE 和 ERE 在功能上已经没有什么区别了,主要的差异是在元字符的转义上。

BRE需要对一些特殊字符进行转义,例如在ERE中可以使用'|'、'+'、'?',而在BRE中则需要转义才能正常使用,例如'\|'、'\+'、'\?'

BRE 之所以这么麻烦的要转义,是因为这些工具的诞生时间很早,有历史遗留问题。

2、Perl 正则表达式

Perl 正则表达式(Perl Regular Expression,又叫 Perl RegEx,简称 PRE

现在常见的正则表达式记法,其实大多都源于 Perl。例如『\d』、『\w』、『\s』之类的记法。


应用范围:

  • (高级)编程语言

参考资料

Linux/Unix 工具与正则表达式的 POSIX 规范

你可能感兴趣的:(正则表达式的历史与几大流派)