POSIX正则表达式 | BRE和ERE

简介

POSIX标准定义了两种regex,分别是BRE(Basic Regular Expression)和ERE(Extended Regular Expression)。linux中的命令(程序)如grep,less,以及一些数据库都实现了POSIX正则表达式。

现代大多数IDE或编程语言使用的正则匹配表达式都更加类似于ERE,而且相比ERE在功能上做了更多的拓展。本文介绍拓展后的BRE,ERE在表达上的差别,对功能的差别不做区分。

基础语法

括号表达式

POSIX括号表达式形如[...],能够匹配表达式所表达的字符集中的一个字符,称为character class。

和一般character class类似,使用[^来反选字符集,使用-来表达范围。

POSIX未定义\d, \w等缩写,但支持以下的命名类:

Character Group Meaning
[:alnum:] Alphanumeric:字母和数字
[:cntrl:] Control Character:控制字符,如DEL,BS等
[:lower:] Lower case character: 小写字母
[:space:] Whitespace:空白字符,包括tab,vertical tab,line feed,carrige return等
[:alpha:] Alphabetic:字母
[:digit:] Digit:数字
[:print:] Printable character:可打印的字符,包括[:alnum:], [:space:], [:punct:]。
[:upper:] Upper Case Character:大写字母
[:blank:] 一般是空格和tab
[:graph:] Printable and visible characters:[:print:] 去掉空白类
[:punct:] Punctuation:标点符号
[:xdigit:] Extended Digit:数字再加上A, B, ..., F.

使用命名类时,需要它们放入括号表达式,例如,[[:digit:]]+ 才能表示连续多个数字,[:digit:]+ 是错误的表达。又如,[[:alpha:][:digit:]] 等同于 [[:alnum:]]

特殊字符

又称作Metacharacter:就是指正则表达式中如+(出现一次或多次), |(或)等有特殊意义的字符。

\w 等效于 [[:alnum:]_]

表示匹配次数的一些表达:

  • * 匹配任意次数, ? 匹配一次或0次,+ 匹配一次或多次
  • {n}:恰出现n次
  • {n,}出现n次或更多
  • {,m}:最多m次。这是GNU拓展
  • {n,m}:最少n次,最多m次

使用 (, ) 来捕获组。

使用 \<\> 分别匹配词首和词尾。使用 \b 匹配词首,等效于 \<

使用 ^ 表示行首,$ 表示行尾。

POSIX BRE vs ERE

grep,sed,vim默认使用BRE语法匹配。

grep,sed加上 -E 选项能够使用ERE匹配。

vim搜索时使用 \V 来设置no magic,搜索字面值;使用 \V 来设置very magic。替换使用 sno 来no magic匹配。

BRE,ERE原本是有功能上的区别的,例如BRE不支持+。但是目前在GNU工具的实现中,二者功能基本一致。唯一的区别在于很多特殊字符在BRE中需要前加 \ 才能表示特殊意义。

例如, "a+" 在BRE中不能够匹配 "a", "aa", ... 而只匹配 "a+"。在ERE中它能够匹配 "a", "aa", ...

这里简单列出一些在BRE中需要带反斜杠的特殊字符:\+, \?, \(, \), \{, \}。值得注意,*, . 在两种语法中都不需要加反斜杠表示特殊含义,而 \<\> 在两种语法中都需要加上反斜杠。

其他

二者均支持capturing group和backreference。使用\n即可表示backreference,其中n是索引,但对于BRE,n取值在1至9之间。

此外,POSIX正则总是greedy,不支持其他的模式。

对于word边界的匹配,POSIX定义了[[:<:]][[:>:]]分别表示匹配左边界和右边界。经过测试,vim和less都不支持POSIX的定义,但支持\<, \>

一些示例

具体用例可以参考grep和sed中的实用例子。

posted @ 2020-09-22 00:14  DDKK64  阅读(1293)  评论(0编辑  收藏  举报