最后修改时间: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的定义,但支持<
, >
。