语法老是有几点忘记,但是正则又很重要,花时间记一下。

首先看一下通用的正则表达式规范,大概如下:

1.位置相关

这里的位置指的是从哪里开始匹配正则表达式,如果不指定,可以从任意位置开始或者结束。

$:从行末开始匹配;

^:从行首开始匹配;

 

2.标识符

是正则表达式最最基本的元素。包括:

2.1 任意字符比如A,a等等;

2.2 .

点号表示任意字符,这个必须特殊记忆,如果我们相匹配真正的点号,需要转义;

2.3 []

在中括号中指定,可以是范围也可以是枚举。注意不要与{}混淆,{}是指重复次数,后面会说;

2.4 [^]匹配不在中括号内的任意字符,也可以是范围或者枚举;

 

3.数量修饰符

3.1 ?

表示0次或1次;

3.2 +

表示一次或多次;

3.3 *

表示0次或多次;

3.4 {m}

表示重复m次;

3.5 {m,n}

至少m,至多n;

3.6 {m,}

至少m次;

 

4.一些特殊字符

4.1()

表示分组;

4.2 \

转义,之前介绍的字符如果使用原本含义都需要转义;

4.3 |

或者

 

但是在shell中,你会发现有时候直接用正则表达式会失效,这是因为正则表达式有不同的版本。不同的平台有不同的实现,单就shell来说,有两种,basic regular expresssion和extended regular expression。分别简称BRE和ERE吧。

shell里不同的命令对RE的支持也不同。

比方说最常见的,sed命令只支持BRE,而awk命令则支持ERE,egrep支持ERE而grep只支持BRE,等等。这些在使用的时候需要注意下。

BRE和ERE的区别:

1)BRE不支持{}()+?六个字符,也就是说直接在BRE里写这六个字符会被当做本身的含义而非前面介绍的特殊的含义。如果要使用特殊含义,必须加转义符。举个例子:[a-z]\{10\}才表示小写字母重复10次;

2)ERE是直接支持这六个字符的,默认是特殊含义,想要使用本身的含义才需要转义。