第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.3POSIX规范哪几类正则表达式?

  传统上,POSIX规范定义了两种正则表达式语法,即:基本型正则表达式(BRE)和扩展型正则表达式(ERE)。大多数linux程序至少要符合BRE规范。linux中,不同的程序支持的正则表达式(RegExp)也不同,如grep、vi、sed只支持BRE。而egrep、awk则支持ERE。

 

 

 

3.4BREERE区别是什么?

现在的BRE和ERE在功能上并没有什么区别,主要区别在于特殊字符(元字符)的转义上。

 

 

 

3.5BREERE定义的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.8POSIX标准方括号表达式

为配合非英语的环境,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

 

posted @ 2017-05-22 18:00  邹龙彬  阅读(513)  评论(0编辑  收藏  举报