POSIX规范
正则表达式两大流派:PCRE与POSIX规范。
之前笔记中的正则表达式记法,如\d、\s、\w之类的字符组简记法就是PCRE规范的正则表达式的特征。
POSIX的全称是Portable Operating System Interface for unix,它由一系列的规范构成,定义了UNIX操作系统应当支持的功能,因此POSIX规范的正则表达式其实就是正则表达式的POSIX规范,它分为BRE(基本型正则表达式)和ERE(扩展型正则表达式)两大流派。
BRE流派
Linux下的vi、grep、sed工具属于BRE这一派,BRE中元字符(、)、{、}必须转义之后才具有特殊意义,比如a\{1,2\}才能匹配字符串a或aa。
BRE不支持+、?量词,多选结构和反向引用\1、\2。
GNU对BRE做了扩展,使之支持+、?、|,但使用时需转义。也支持\1、\2之类的反向引用。
ERE流派
Linux下的egrep、awk属于ERE流派。这一流派中使用元字符时不用转义,支持量词等。
现在的BRE和ERE的主要差异是元字符是否需转义。
POSIX字符组
PCRE流派中把[....]称为“字符组”;在POSIX中,它们叫做"方括号表达式",其作用与规则与常说的"字符组"完全一样。但是POSIX中的"方括号表达式"不支持使用\uxxxx的形式表示Unicode字符。即遵循POSIX规范的正则表达式无法用[\u4e00-\u9fff]来匹配"任意一个中文字符"。
POSIX自己也定义了字符组,称为"POSIX字符组",是一些事先定义好的组合,比如[:digit:]就是一个POSIX字符组,它等价于[0-9],[:alpha:]等价于[a-zA-Z]。此外PCRE中常见的\d、\w、\s在POSIX中没有定义。
POSIX字符组不能直接使用,只能用于方括号表达式内部,如[[:digit:]]、[[:alpha:]];POSIX字符组也可以与其他方括号表达式合用,如[a-zA-Z[:digit:]]、[^[:alpha:]]。