正则表达式篇 之三(BRE和ERE区别)及ELISP
正则表达式篇 之三(BRE和ERE区别)
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和ERE二者的区别,简单的说就在于(、)、{、}、+、?、|这7个特殊字符的使用方法上:
- 在BRE中如果想要这些字符表示特殊的含义,就需要把它们转义。
- 反之,在ERE中如果要这些字符不表示特殊的含义,就需要把它们转义。
- BRE中的特殊字符:
.、\、[、^、$、*。- ERE中的特殊字符多了7个,即:
.、\、[、^、$、*、(、)、{、}、+、?、|。
BRE
在Linux/Unix常用工具中,grep、vi、sed都属于BRE这一派,它的语法看起来比较奇怪,元字符 (、)、{、}、+、?、| 必须转义之后才具有特殊含义,如\+、\?、\|,而且也支持\1、\2之类反向引用。
ERE
在Linux/Unix常用工具中,egrep、awk则属于ERE这一派。虽然BRE名为“基本”而ERE名为“扩展”,但ERE并不要求兼容BRE的语法,而是自成一体。
注:PCRE中常用\b来表示“单词的起始或结束位置”,但Linux/Unix的工具中,通常用\<来匹配“单词的起始位置”,用\>来匹配“单词的结束位置”,sed中的\y可以同时匹配这两个位置。
POSIX字符组
在某些文档中,你还会发现类似[:digit:]、[:lower:]之类的表示法,它们看起来不难理解(digit就是“数字”,lower就是“小写”),但又很奇怪,这就是POSIX字符组。
在POSIX规范中,[a-z]、[aeiou]之类的记法仍然是合法的,其意义与PCRE中的字符组也没有区别,只是这类记法的准确名称是POSIX方括号表达式(bracket expression),它主要用在Unix/Linux系统中。
POSIX与PCRE方括号表示法的区别
POSIX与PCRE方括号表示法的最主要差别在于:POSIX字符组中,反斜线\不是用来转义的。所以POSIX方括号表示法[\d]只能匹配\和d两个字符,而不是[0-9]对应的数字字符。
-- 参考linux 的 grep
正则表达式篇 之三(BRE和ERE区别) - 简书 (jianshu.com)
man grep ELISP:不支持\d
Regexp Backslash (GNU Emacs Manual)
Regexp Backslash (GNU Emacs Lisp Reference Manual)

浙公网安备 33010602011771号