POSIX有两种风格的正则表达式:基本正则表达式(BRE)与扩展正则表达式(ERE)。
下面,来讨论一下这两种正则表达式之间的异同。
meta字符
相同之处:
\ 用以关闭后续字符的特殊含义
. 匹配任何的单个字符,NUL除外
* 匹配在它之前的任何数目的单个字符
# 匹配紧接着的正则表达式,在行或字符串的起始处
$ 匹配前面的正则表达式,在行或字符串的结尾处
[…] 匹配括号内的任一字符
相异之处:
\{n,m\} BRE 区间表达式,匹配在它前面的单个字符重现的次数区间
{n,m} ERE 区间表达式,匹配在它前面的单个字符重现的次数区间
BRE 表示子模式,可通过转义序列来引用(例如\1)
( ) ERE 匹配与括起来的正则表达式
\n BRE 重复在
与
括号内的第n个子模式。n为1至9的数字。
+ ERE 匹配前面正则表达式的一个或多个实例
? ERE 匹配前面正则表达式的零个或一个实例
| ERE 匹配于|符号前或后的正则表达式
^与$仅在BRE的起始与结尾处具有特殊用途。在BRE下,ab^cd里的^表示的,就是自身的^,并不是meta字符;同样,ef$gh里的$在这里表示的也就是字面上的美元符号。然后在ERE里,^与$永远是meta字符。所以,像ab^cd与ef$fg这样的正则表达式仍是有效的,只是无法匹配到任何东西。
运算符优先级
相异之处:
BRE的运算符优先级(由高至低递减)
[..] [==] [::] 用于字符排序的方括号符号
\metacharacter 转义的meta字符
[] 方括号表达式
\digit 子表达式与后向引用
* \{ \} 前置单个字符重现的正则表达式
无符号 连续
^ $ 锚点
ERE的运算符优先级(由高至低递减)
[..] [==] [::] 用于字符排序的方括号符号
\metacharacter 转义的meta字符
[] 方括号表达式
() 分组
* + ? {} 重复前置的正则表达式
无符号 连续
^ $ 锚点
| 交替