深入浅出 Hyperscan:高性能正则表达式算法原理与设计
上QQ阅读APP看书,第一时间看更新

1.2.2 POSIX标准

在Perl和PCRE发展时,电气与电子工程师学会(Institute of Electrical and Electronics Engineers,IEEE)也开始制定正则表达式的可移植操作系统接口(Portable Operating System Interface,POSIX)标准来规范不同的正则表达式流派。

1.BRE和ERE

正则表达式POSIX标准把正则表达式分成两大类:基本正则表达式(Basic Regular Expression,BRE)和扩展正则表达式(Extended Regular Expression,ERE),遵循POSIX标准的程序必须支持其中任意一种。BRE和ERE的主要区别如表1.8所示。

表1.8 BRE和ERE的主要区别

在传统的UNIX常用工具中,grep、vi和sed等都属于BRE流派,所以当它们使用像()、{}这样的元字符时,元字符前面必须要加转义符,而且BRE流派也不支持+、?量词,以及…|…多选结构。但是,今天纯粹的BRE已经很少见了,GNU对BRE做了扩展,使得BRE也能支持+、?量词,以及…|…多选结构,不过这些元字符前面都必须要加转义符变成+、\?、|。所以,GNU的grep等工具严格地说应该属于GNU BRE[2]

而在传统的UNIX常用工具中,egrep、grep –E和awk等就属于ERE流派。ERE名为扩展,但其并不是BRE的扩展,而是自成一体。ERE中元字符使用时前面无须加转义符,并且支持+和?量词,支持…|…多选结构。值得注意的是,POSIX ERE标准中并没有定义\x反向引用的实现。GNU同样对ERE做了扩展,使得ERE能够支持\x反向引用的功能。所以,GNU的egrep等工具严格地说属于GNU ERE[2]

其实从功能来看,GNU BRE和GNU ERE已经基本没有区别了。最大的不同就是GNU ERE元字符使用时前面不需要加转义符。

2.POSIX字符组 

在POSIX标准中,[a-z]和[^a-z]这样的字符组表示是合法的。但是POSIX标准还支持一种特别的字符组表示,类似于[[:alnum:]]和[[:alpha:]],这其实是POSIX标准方括号表达式的一种特殊功能。POSIX方括号表达式与PCRE字符组[…]和[^…]最主要的区别在于,POSIX方括号表达式内部\不是用来转义的,所以在POSIX中[\d]匹配的是\和d两个字符。

POSIX字符组其实就是在POSIX方括号表达式内使用几种特殊元字符。值得注意的是,POSIX字符组表示的是当前语言环境下对应的字符,因此POSIX字符组详细的列表会根据当前语言环境的变化而变化。此外,这种特殊的元字符只有在方括号表达式内部才是有效的,所以使用完整的POSIX字符组时必须写成[[:alnum:]]。

表1.9列举了一些常见的POSIX字符组的元字符及其含义,这些元字符通常在不同的语言环境下都能支持[1]

表1.9 POSIX字符组的元字符及其含义