第3章:正则表达式
第3章:正则表达式
3.1、什么是POSIX?
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945
3.2、什么是正则表达式?
正则表达式是一种表示方式,可以查找匹配特定准则的文本。正则表达式由两个基本组成部分所建立,一般字符与特殊字符。
3.3、POSIX规范哪几类正则表达式?
传统上,POSIX规范定义了两种正则表达式语法,即:基本型正则表达式(BRE)和扩展型正则表达式(ERE)。大多数linux程序至少要符合BRE规范。linux中,不同的程序支持的正则表达式(RegExp)也不同,如grep、vi、sed只支持BRE。而egrep、awk则支持ERE。
3.4、BRE和ERE区别是什么?
现在的BRE和ERE在功能上并没有什么区别,主要区别在于特殊字符(元字符)的转义上。
3.5、BRE和ERE定义的meta字符 (元字符又叫特殊字符),如下表格所示:
标注:例如grep只支持BRE,如果grep使用ERE需要加 –E 选项,即 grep –E
3.6、表达式单引号’ ’ 和双引号 “ ” 区别?
1、单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。
2、双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
3、一般常量用单引号''括起,如果含有变量则用双引号""括起。
4、单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般元字符 ,而不会有特殊符号。
5、” ”号里面遇到$,\等特殊字符会进行相应的变量替换。
6、’ ’号里面的所有字符都保持原样。
7、对于字符串,两者相同匹配模式也大致相同,但有一些区别非常容易混淆,看以下举例。
grep "$a" file #引用变量a,查找变量a的值
grep '$a' file #查找“$a”字符串
grep "\\" file #grep: Trailing backslash(不知原因)
grep '\\' file #查找‘\’字符
3.7、简单正则表达式匹配范例
标注:以grep命令举例,grep是以行为单位输出内容。
1、 . 元字符举例,输出匹配任意一个字条。
[root@cloucentos6 home]# cat test
abc
a1a2a3
akcd
[root@cloucentos6 home]# grep 'a.c' test
abc
akcd
2、 * 元字符举例,输出匹配0次或多次前面的单个字符。
[root@cloucentos6 home]# cat test
abc
ac
abbbc
aQc
AQQC
[root@cloucentos6 home]# grep 'ab*c' test
abc
ac
abbbc
3、 ^ 元字符举例,输出匹配以a开头的行。
[root@cloucentos6 home]# cat test
a1
b2
c3
[root@cloucentos6 home]# grep '^a' test
a1
4、 $ 元字符举例,输出匹配以3结尾的行。
[root@cloucentos6 home]# cat test
a1
b2
c3
a1b2c3d4
[root@cloucentos6 home]# grep '3$' test
c3
5、 [ ] 元字符举例,输出匹配 [a-c]字符集里的a到c的字母。
[root@cloucentos6 home]# cat test
yau
ybu
ycu
yeu
yfu
[root@cloucentos6 home]# grep 'y[a-c]u' test
yau
ybu
ycu
6、 [^ ] 元字符举例,输出不匹配 [a-c]字符集里的a到c的字母。
[root@cloucentos6 home]# cat test
yau
ybu
ycu
yeu
yfu
[root@cloucentos6 home]# grep 'y[^a-c]u' test
yeu
yfu
7、x\{m\} x\{m,\} x\{m,n\} 元字符举例,b为重复字符,m和n为次数。
[root@cloucentos6 home]# cat test
abc
abbc
abbbc
abbbbc
[root@cloucentos6 home]# grep a'b\{2\}'c test
abbc
[root@cloucentos6 home]# grep a'b\{2,\}'c test
abbc
abbbc
abbbbc
[root@cloucentos6 home]# grep a'b\{2,3\}'c test
abbc
abbbc
8、( ) 和 | 配合使用,输出匹配good和glad两个单词的行。
[root@cloucentos6 home]# cat test
good
glad
gffd
[root@cloucentos6 home]# grep -E g'(oo|la)'d test
good
glad
3.8、POSIX标准方括号表达式
为配合非英语的环境,POSIX标准强化其字符集范围的能力(例如 [a-z]),以匹配是非英文字母字符。早先在看到的范围表达式在UNIX里通常称为字符集,在POSIX标准下叫做方括号表达式,在方括号表达式里,除了字面上的字符(例如 z , ; 等等)之外,另有额外组成的部分:
1、 字符集
以 [:与:] 将关键字组合括起来的POSIX字符集,关键字描述各种不同的字符集,如下表所示:
2、 排序符号
排序符号指的是将多字符序列视为一个单位,它使用 [.与.] 将字符组合括起来,排序符号 在系统所使用的特定locale上各有其定义。
3、 等价字符集
等价字符集列出的是应视为等值的一组字符,例如e与é。它由取自于locale的名字元素组成,以 [=与=] 括住。
3.9、基本正则表达式
3.9.1、匹配单个字符
最先开始匹配单个字符,可采用集中方式做到:以一般字符、以转义的meta字符,以.(点号)meta字符或是用方括号表达式:
(1)、一般字符
包括所有的文字和数字字符、绝大多数的空白字符以及标点符号字符。表达式a匹配于字符a。一般字符所表示的就是它们自己,且这种用法应是最直接且易于理解的。所以, shell匹配于shell,worD匹配于worD,但不匹配于word。
(2)、meta字符(特殊字符)
若meta字符(特殊字符)不能表示它们自己,使用meta字符表示它们自己需要使用转义字符进行转义(转义字符 \ 反斜杠),例如 \+ 匹配于 + 加号, \ * 匹配于 * 星号。(如果一般字符前,例如 \a,则POSIX标准保留此行为模式为未定义状态,通常这种情况下反斜杠会被忽略)
(3)、 . (点号)
. (点号)字符表示”任意一个字符”。因此,a.c匹配于abc、aac、aqc等。单个点号用以表示自己的情况很少,一般会与其它的meta字符搭配使用,这一结合允许匹配多个字符。
(4)、括号表达式
最简单的方括号表达式是直接将字符列表放在方括号里,例如 [abced] 表示方括号里的所有的小写字母。举例来说,c[aoe]t匹配于cat、cot、cet,但不匹配于cbt等。
知识点1:
方括号表达式里,^放在方括号的字首表示是取反的意思,例如c[^aoe]t不匹配于cat、cot、cet以外的都匹配。
知识点2:
方括号表达式简单匹配所有字母或数字表示方法,例如 [0-9] 表示数字0到9,[az]表示字母a和z,[a-z]表示字母a到z, [0-9a-zA-Z]表示数字0-9和大小写字母a-z
知识点3:
正则表达式[ab[.ch.]de]匹配于a、b、d、e或者是成对ch,但不匹配于单独的c或h。
知识点4:
正则表达式[a[=e=]cd]等同于[aecd]或者[aécd]等。
知识点5:
字符集[:lower:]这样的正则表达式匹配于l、o、w、e、r以及: ,表示所有小写字母正常的写法应为 [[:lower:]]
3.9.2、单个表达式匹配多个字符
匹配多个字符最简单的方法就是把他们一个接一个(连接)列出来,所以正则表达式ab匹配于ab, .. (两个点号)匹配于任意两个字符,而[[:upper:]][[:lower:]]匹配于任意一个大写字母,后面接着任意一个小写字母。不过,将这些字符全列出来只有在简短的正则表达式里才好用。
正则表达式真正强大的功能,其实是在修饰符meta字符的使用上,这类meta字符紧接在具有单个字符的正则表达式之后,且它们会改变正则表达式的含义。电子常用的修饰符为星号(*),表示匹配于0个或多个前面的单个字符。因此ab*c表示的匹0或多个b字符,这个正则表达式匹配于ac、abc、abbc等。
知识点1:
修饰符星号(*)只能表示0个或任意多个,但不能表示具体匹配个数,这里就需要使用到区间表达式。\{n\} 表示结果重现n次,\{n,\}表示结果重现至少n次,\{m,n\}表示结果重现n至m次。
3.9.3、文本匹配锚点
Meta字符是脱字符号^ 和 货币符号$ ,它们叫做锚点,因为其用途在限制正则表达式匹配时,针对要被匹配的字符串的开始或结尾处进行匹配,如下表所示:
知识点1:
^和$可以同时使用,它可以用来匹配空的字符串或行列。配合grep –v 一起使用,例如:
[root@cloucentos6 home]# cat test
abc
123
[root@cloucentos6 home]# cat test | grep -v '^$'
abc
123