最后修改时间:2020/11/9
简介
POSIX标准定义了两种regex,分别是BRE(Basic Regular Expression)和ERE(Extended Regular Expression)。linux中的命令(程序)如grep,less,以及一些数据库都实现了POSIX正则表达式。
POSIX括号表达式
POSIX括号表达式形如[...],能够匹配表达式所表达的字符集中的一个字符,是一种特殊的字符类(character class)。
和一般character class类似,使用[^来反选字符集,使用-来表达范围。
字符类(character class)
POSIX未定义d, w等缩写,但支持以下的命名类:
| Character Group | Meaning |
|---|---|
| [:alnum:] | Alphanumeric |
| [:cntrl:] | Control Character |
| [:lower:] | Lower case character |
| [:space:] | Whitespace |
| [:alpha:] | Alphabetic |
| [:digit:] | Digit |
| [:print:] | Printable character |
| [:upper:] | Upper Case Character |
| [:blank:] | whitespace, tabs, etc. |
| [:graph:] | Printable and visible characters |
| [:punct:] | Punctuation |
| [:xdigit:] | Extended Digit |
使用命名类时,需要再外加方括号,如同[[:alnum:]]。
POSIX BRE
**大多数Regex flavor包括POSIX ERE的metacharacter都不含前缀,但是BRE的一些metacharacter相反。
BRE中,^, $, ., *, 这几个符号需要转义才能使用字面值。
BRE的其他metacharacter需要含表示特殊语义。a{1,2}匹配字符串a{1,2},而a{1,2}匹配a, aa。BRE不支持量词+、?.但支持以下表达式:
{n}:恰出现n次
{n,}出现n次或更多
{,m}:最多m次。这是GNU拓展。
{n,m}:最少n次,最多m次
BRE使用(和)来将字符组合成组。支持回溯。
此外BRE不要求支持|, +, ?。但是,GNU实现的BRE和ERE没有功能上的差别。因此在grep,less等命令中可以使用|表示或,使用+表示匹配一次或多次,使用'?'表示匹配0次或1次。
POSIX ERE
POSIX ERE的metacharacter不含前缀。如a{1,2}能够匹配a, aa。
ERE能够支持|, ?, +。
其他
二者均支持capturing group和backreference。使用
即可表示backreference,其中n是索引,但对于BRE,n取值在1至9之间。
此外,POSIX正则总是greedy,不支持其他的模式。
对于word边界的匹配,POSIX定义了[[:<:]]和[[:>:]]分别表示匹配左边界和右边界。GNU拓展则使用<和>。经过测试,vim和less都不支持POSIX的定义,但支持<, >。