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/
Be First to Comment