POSIX 正则表达式 BRE 与 ERE的区别

传统上,POSIX定义了两种正则表达式语法,即:基本正则表达式(BRE)和扩展正则表达式(ERE)。大多数LINUX程序至少要符合BRE规范。linux中,不同的程序支持的REGXP也不同,如sed只支持BRE的大部分,这主要是收到速度的限制。sed编辑器要尽可能快的处理数据流中的文本。而grep可以支持ERE,不过要使用-E选项。gawk使用BRE引擎。其中,BRE定义的语法符号包括:.-匹配任意一个字符。[]-字符集匹配,匹配方括号中定义的字符集之一。[^]-字符集否定匹配,匹配没有在方括号中定义的字符。^-匹配开始位置。$-匹配结束位置。\(\)-定义子表达式。\n-子表达式向前引用,n为1-9之间的数字。由于此功能已超出正则语义,需要在字符串中回溯,因此需要使用NFA算法进行匹配。*-任意次匹配(零次或多次匹配)。\{m,n\}-至少m次,至多n次匹配;\{m\}表示m次精确匹配;\{m,\}表示至少m次匹配。ERE修改了BRE中的部分语法,并增加了以下语法符号:?-最多一次匹配(零次或一次匹配)。+-至少一次匹配(一次或更多次匹配)。|-或运算,其左右操作数均可以为一个子表达式。同时,ERE取消了子表达式"()"和次数匹配"{m,n}"语法符号的转义符引用语法,在使用这两种语法符号时,不在需要添加转义符。与此同时,ERE也取消了非正则语义的子表达式向前引用能力。BRE和ERE共享同样的POSIX字符类定义。同时,它们还支持字符类比较操作"[..]"和字符来等效体"[==]"操作,但很少被使用。f/fr/wfr/bwfr等工具默认使用ERE模式,同时支持以下PERL风格的字符类:POSIX类perl类描述----------------------------------------------------------------------------[:alnum:]字母和数字[:alpha:]\a字母[:lower:]\l小写字母[:upper:]\u大写字母[:blank:]空白字符(空格和制表符)[:space:]\s所有空格符(比[:blank:]包含的范围广)[:cntrl:]不可打印的控制字符(退格、删除、警铃...)[:digit:]\d十进制数字[:xdigit:]\x十六进制数字[:graph:]可打印的非空白字符[:print:]\p可打印字符[:punct:]标点符号-此外,还有以下特殊字符类:perl类等效POSIX表达式描述----------------------------------------------------------------------------\o[0-7]八进制数字\O[^0-7]非八进制数字\w[[:alnum:]_]单词构成字符\W[^[:alnum:]_]非单词构成字符\A[^[:alpha:]]非字母\L[^[:lower:]]非小写字母\U[^[:upper:]]

详细出处参考:http://www.itqun.net/content-detail/76708.html

相关推荐