• 第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

  • 相关阅读:
    windows7 下 apache2.4 和 php5.5 及 mysql5.6 的安装与配置
    JavaScript高级编程 (1)
    关于解决乱码问题的一点探索之二(涉及Unicode(utf-16)和GBK)
    关于解决乱码问题的一点探索之一(涉及utf-8和GBK)
    Windows上安装、配置MySQL的常见问题
    解析DXF图形文件格式
    vue三十一:vue配置反向代理
    vue三十:eslint修复错误和打包用于生产
    vue二十九:多个文件组件集成
    vue二十八:Vue-Cli之环境搭建之node安装脚手架和使用脚手架创建vue项目
  • 原文地址:https://www.cnblogs.com/zoulongbin/p/6890649.html
Copyright © 2020-2023  润新知