POSIX标准定义了两种regex,分别是BRE(Basic Regular Expression)和ERE(Extended Regular Expression)。linux中的命令(程序)如grep,less,以及一些数据库都实现了POSIX正则表达式。
大多数Regex flavor包括POSIX ERE都使用\
来对metacharacter进行转义,但是BRE的一些metacharacter需要在之前加上\
才能表达其语义。
BRE支持字符类和括号表达式。但不支持\d
, \w
等缩写。标准BRE支持12中命名类,以下为部分:字母数字[:alnum:]
,字母[:alpha:]
,数字[:digit:]
,空白(space和tab)[:blank:]
,空白字符[:space:]
,控制字符[:cntrl:]
。
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不支持捕获组。
此外BRE不支持“或”(alternation)的特性,即不支持|
。但是,GNU实现的BRE和ERE没有功能上的差别。因此在grep,less等命令中可以使用\|
表示或,使用\+
等量词。
POSIX ERE使用\
来对metacharacter进行转义。metacharacter可直接使用,代表其特殊意义。如a{1,2}
能够匹配a
, aa
。
ERE能够支持|
, ?
, +
。
原文:https://www.cnblogs.com/wyzersblog/p/13709354.html