- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
正则表达式BRE与ERE对比
Linux/Unix 下的POSIX 规范
2011-07-12 15:21 余晟 InfoQ 我要评论(1) 字号:T | T
很多读者一定不会陌生『\d』、『[a-z]+』之类的表达式,但是如果你用过vi、grep、awk、
sed 之类Linux/Unix 下的工具或许会发现,这些工具虽然支持正则表达式,语法却很不一
样,照通常习惯的办法写的『\d』、『[a-z]+』之类的正则表达式,往往不是无法识别就是
匹配错误。而且,这些工具自身之间也存在差异,同样的结构,有时需要转义有时不需要转
义。这,究竟是为什么呢?原因在于,Unix/Linux 下的工具大多采用POSIX 规范
对正则表达式有基本了解的读者,一定不会陌生『\d』、『[a-z]+』之类的表达式,前
者匹配一个数字字符,后者匹配一个以上的小写英文字母。但是如果你用过vi、grep、awk、
sed 之类Linux/Unix 下的工具或许会发现,这些工具虽然支持正则表达式,语法却很不一
样,照通常习惯的办法写的『\d』、『[a-z]+』之类的正则表达式,往往不是无法识别就是
匹配错误。而且,这些工具自身之间也存在差异,同样的结构,有时需要转义有时不需要转
义。这,究竟是为什么呢?
原因在于,Unix/Linux 下的工具大多采用POSIX 规范,同时,POSIX 规范又可分为两种
流派(flavor)。所以,首先有必要了解一下POSIX 规范。
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 规范。
BRE
在Linux/Unix 常用工具中,grep、vi、sed 都属于BRE 这一派,它的语法看起来比较
奇怪,元字符 『(』、『)』、『{』、『}』必须转义之后才具有特殊含义,所以正则表达式
『(a)b』只能匹配字符串 (a)b 而不是字符串ab;正则表达式『a{1,2}』只能匹配字符串
a{1,2},正则表达式『a\{1,2\}』才能匹配字符串a 或者aa。
之所以这么麻烦,是因为这些工具的诞生时间很早,正则表达式的许多功能却是逐步发
展演化出来的,之前这些元字符可能并没有特 的含义;为保证向后兼容,就只能使用转义。
而且有些功能甚至根本就不支持,比如BRE 就不支持『+』和 『?』量词,也不支持多选结构
『(…|…)』和反向引用『\1』、『\2』…。
不过今天,纯粹的BRE 已经很少见了,毕竟大家已经认为正则表达式“理所应当”支持
多选结构和反向引用等功能,没有确实太不方便。所以虽然vi 属于BRE 流派,但提供了这
些功能。GNU 也对BRE 做了扩展,支持『+』、『?』、『|』,只是使用时必须写成 『\+』、
『\?』、『\|』,而且也支持『\1』、『\2』之类反向引用。这样,GNU 的grep 等工具虽
然名义上属于BRE 流,但更确切的名称是GNU BRE。
ERE
在Linux/Unix 常用工具中,egrep、awk 则属于ERE 这一派,。虽然BRE 名为 “基本”
而ERE 名为“扩展”,但ERE 并不要求兼容BRE 的语法,而是自成一体。因此其中的元字符
不用转义(在元字符之前添加反斜线会取消其特殊含义),所以 『(ab|cd)』就可以匹配字符
串ab 或者cd,量词 『+』、『?』、『{n,m}』可以直接使用。ERE 并没有明确规定支持反向
引用,但是不少工具都支持『\1』、『\2』之类的反向引用。
文档评论(0)