Skip to content

Linux grep BRE ERE PCRE 详解

POSIX规范

常见的正则表达式记法,其实都源于Perl,实际上,正则表达式从Perl衍生出一个显赫的流派,叫做PCRE(Perl Compatible Regular Expression),\d、\w、\s 之类的记法,就是这个流派的特征。

但是在PCRE之外,正则表达式还有其它流派,比如下面要介绍的POSIX规范的正则表达式。


POSIX的全称是Portable Operating System Interface for uniX,它由一系列规范构成,定义了UNIX操作系统应当支持的功能,

所以“POSIX规范的正则表达式”其实只是“关于正则表达式的POSIX规范”,它定义了BRE(Basic Regular Expression,基本型正则表达式)和ERE(Extended Regular Express,扩展型正则表达式)两大流派。

在兼容POSIX的UNIX系统上,grep和egrep之类的工具都遵循POSIX规范,一些数据库系统中的正则表达式也符合POSIX规范。


具体规范如下表:


从上图可以看出,有三个空白栏,那么是不是就意味这无法使用该功能了呢?

答案是否定的,因为我们现在使用的linux发行版,都是集成GNU套件的,GNU是Gnu’s Not Unix的缩写,GNU在实现了POXIS标准的同时,做了一定的扩展,所以上面空白栏中的功能也能使用。


下面一 一讲解:
BRE如何使用+、?呢?需要用\+、\?
BRE如何使用|呢?需要用\|
ERE如何使用\1、\2…\9这样的反引用?和BRE一样,就是\1、\2…\9
通过上面总结,可以发现:GNU中的ERE与BRE的功能相同,只是语法不同(BRE需要用\进行转义,才能表示特殊含义)。例如a{1,2},在ERE表示的是a或aa,在BRE中表示的是a{1,2}这个字符串。


BRE和ERE二者的区别,简单的说就在于(、)、{、}、+、?、|这7个特殊字符的使用方法上:

在BRE中如果想要这些字符表示特殊的含义,就需要把它们转义。
反之,在ERE中如果要这些字符不表示特殊的含义,就需要把它们转义。
BRE中的特殊字符:.、\、[、^、$、*。
ERE中的特殊字符多了7个,即:.、\、[、^、$、*、(、)、{、}、+、?、|。

为了能够在Linux下熟练使用文本处理工具,我们必须知道这些命令支持那种正则表达式。

现对常见的命令总结如下:
- 使用BRE语法的命令有:grep、ed、sed、vim
- 使用ERE语法的命令有:egrep、awk、emacs
当然,这也不是绝对的,比如 sed 通过-r 选项就可以使用ERE了,大家到时自己man一下就可以了。

POSIX字符组:

POSIX字符组

说明

ASCII语言环境

Unicode语言环境

[:alnum:]*

字母字符和数字字符

[a-zA-Z0-9]

[\p{L&}\p{Nd}]

[:alpha:]

字母

[a-zA-Z]

\p{L&}

[:ascii:]

ASCII字符

[\x00-\x7F]

\p{InBasicLatin}

[:blank:]

空格字符和制表符

[ \t]

[\p{Zs}\t]

[:cntrl:]

控制字符

[\x00-\x1F\x7F]

\p{Cc}

[:digit:]

数字字符

[0-9]

\p{Nd}

[:graph:]

空白字符之外的字符

[\x21-\x7E]

[^\p{Z}\p{C}]

[:lower:]

小写字母字符

[a-z]

\p{Ll}

[:print:]

类似[:graph:],但包括空白字符

[\x20-\x7E]

\P{C}

[:punct:]

标点符号

[][!”#$%&'()*+,./:;<=>?@\^_`{|}~-]

[\p{P}\p{S}]

[:space:]

空白字符

[ \t\r\n\v\f]

[\p{Z}\t\r\n\v\f]

[:upper:]

大写字母字符

[A-Z]

\p{Lu}

[:word:]*

字母字符

[A-Za-z0-9_]

[\p{L}\p{N}\p{Pc}]

[:xdigit:]

十六进制字符

[A-Fa-f0-9]

[A-Fa-f0-9]

PCRE标准

Perl语言第一版是由Larry Wall发布于1987年12月,Perl在发布之初,就因其强大的功能而一票走红,Perl的定位目标就是“天天要使用的工具”。Perl比较显诸特征之一是与sed与awk兼容,这造就了Perl成为第一个通用性脚本语言。

随着Perl的不断发展,其支持的正则表达式的功能也越来越强大。其中影响较大的是于1994年10月发布的Perl 5,其增加了很多特性,比如non-capturing parentheses、lazy quantifiers、look-ahead、元符号\G等等。
正好这时也是WWW兴起的时候,而Perl就是为了文本处理而发明的,所有Perl基本上成了web开发的首选语言。Perl语言应用是如此广泛,以至于其他语言开始移植Perl,最终Perl compatible(兼容)的PCRE诞生了,这其中包括了Tcl, Python, Microsoft’s .NET , Ruby, PHP, C/C++, Java等等。




相关参考资料:

https://www.gnu.org/software/grep/manual/html_node/Regular-Expressions.html 

https://en.wikipedia.org/wiki/Regular_expression 

在线测试REGEXP: http://www.regextester.com/

Published in开发语言系统运维

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注