正则中常见的流派及其特性

目前正则表达式主要有两大流派(Flavor):POSIX 流派与 PCRE 流派。

1、 POSIX 流派

POSIX 规范定义了正则表达式的两种标准:

  • BRE 标准(Basic Regular Expression 基本正则表达式);
  • ERE 标准(Extended Regular Expression 扩展正则表达式)。

我们现在使用的 Linux 发行版,大多都集成了 GNU 套件。GNU 在实现 POSIX 标准时,做了一定的扩展,主要有以下三点扩展。

  1. GNU BRE 支持了 +、?,但转义了才表示特殊含义,即需要用\+、\?表示。
  2. GNU BRE 支持管道符多选分支结构,同样需要转义,即用 \|表示。
  3. GNU ERE 也支持使用反引用,和 BRE 一样,使用 \1、\2…\9 表示。

浅黄色背景是 BRE 和 ERE 不同的地方,三处天蓝色字体是 GNU 扩展。

POSIX 流派还有一个特殊的地方,就是有自己的字符组,叫 POSIX 字符组。这个类似于我们之前学习的 \d 表示数字,\s 表示空白符等,POSIX 中也定义了一系列的字符组。具体的清单和解释如下所示:

 2、 PCRE 流派

目前大部分常用编程语言都是源于 PCRE 标准,这个流派显著特征是有\d、\w、\s 这类字符组简记方式。

虽然 PCRE 流派是与 Perl 正则表达式相兼容的流派,但这种兼容在各种语言和工具中还存在程度上的差别,这包括了直接兼容与间接兼容两种情况。Perl 语言中的正则表达式在不断改进和升级之中,其他语言和工具不可能完全做到实时跟进与更新。

  • 直接兼容,PCRE 流派中与 Perl 正则表达式直接兼容的语言或工具。比如 Perl、PHP  preg、PCRE 库等,一般称之为 Perl 系。
  • 间接兼容,比如 Java 系(包括 Java、Groovy、Scala 等)、Python 系(包括 Python2 和 Python3)、JavaScript 系(包括原生 JavaScript 和扩展库 XRegExp)、.Net 系(包括 C#、VB.Net 等)等。

3、在 Linux 中使用正则

在遵循 POSIX 规范的 UNIX/LINUX 系统上,按照 BRE 标准 实现的有 grep、sed 和 vi/vim 等,而按照 ERE 标准 实现的有 egrep、awk 等。

在 UNIX/LINUX 系统里 PCRE 流派与 POSIX 流派的对比。

 其实有一些工具实现同时兼容多种正则标准,比如 grep 和 sed。如果在使用时加上 -E 选项,就是使用 ERE 标准;如果加上 -P 选项,就是使用 PCRE 标准。

使用 ERE 标准
grep -E '[[:digit:]]+' access.log

使用 PCRE 标准
grep -P '\d+' access.log

执行 man grep ,可以看到选项 -G 是指定使用 BRE 标准(默认),-E 是 ERE 标准,-P 是 PCRE 标准。所以,在使用具体工具时,你通过这个方法查一下命令的说明就好了。

此文章为8月Day24学习笔记,内容来源于极客时间《正则表达式入门课》,推荐该课程。

猜你喜欢

转载自blog.csdn.net/key_3_feng/article/details/132484029