语法老是有几点忘记,但是正则又很重要,花时间记一下。
首先看一下通用的正则表达式规范,大概如下:
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是直接支持这六个字符的,默认是特殊含义,想要使用本身的含义才需要转义。