一 .什么是正则表达式

  正则表达式(Regular Expression,RE)就是由一系列特殊字符组成的字符串。其中每个特殊字符都被成为元字符,这些元字符并不表示他们字面上的含义,而是被解释为一些特定的含义。

   正则表达式是由普通字符和元字符共同组成的集合,这个集合用来匹配(或指定)模式。正则表达式的主要功能是文本查询和字符串的操作,正则表达式可以匹配文本的一个字符或字符集合

    例如,a b 1 2 等字符属于普通字符,普通字符可以按照字面意思理解,如a只能理解为英文的小写字母a,没有其他隐藏含义。而* ^ []等元字符,shell赋予了他们超越字面的意思的意义,如*符号的字面意义只是一个符号,而实际上却表示了重复前面的字符0次或者多次的隐藏含义

二 .正则表达式的组成

   一个正则表达式包含下列一项或多项

  1.   一个字符集:这次所指的字符集只包含普通字符,这些字符只表示他们的字面含义.正则表达式的最简单形式就是只包含字符集,而且不包含元字符.
  2.    锚: 指定了正则表达式所要匹配的文本行中所处的位置,如^和$就是锚
  3.    修饰符: 它们扩大或缩小(修改)了正则表达式匹配文本的范围.修饰符包含星号,括号和反斜杠.

                          正则表达式中符号含义

  

字符 含义
* 匹配前面一个普通字符0次或者多次
. 匹配任意一个字符
^ 匹配行首或后面字符的非
$ 匹配行尾
[] 匹配字符集合
\ 转义符,屏蔽一个元字符的特意义
\<\> 精确匹配符号
\{n\} 匹配前面字符出现n次
\{n,\} 匹配前面字符至少出现n次
\{n,m\} 匹配前面字符出现n次与m次之间

    其中:

  •        *用于匹配前面的一个普通字符的0次或者多次重复,例如.w*en,*符号前面的普通字符字符是w,*号字符就表示匹配w字符0次或者多次,如果字符串wen,wwen,wwwwen都可以用w*en来表示
  •             .用于匹配任意一个字符,例如,...69.表示前面三个字符为任意字符,第四个个第五个字符是6和9 最后一个字符为任意字符,如xcb698,gfr69p都能匹配上述字符串
  •              ^用于匹配行首,表示行首的字符是^字符后面的那个字符,例如: ^cloud表示匹配以cloud开头的行
  •              $匹配行尾,$放在匹配字符之后,例如,micky$表示以micky结尾的所有行,^$表示空行
  •              []匹配字符集合,在正则表达式中,将匹配中括号字符集中的某一个字符,例如:
    •   [xyz]将会匹配字符x,y,或z
    •        [c-n]匹配字符c~n之间的任意一个字符
    •        [B-Pk-y]匹配从B~P,或者k~y之间的任意一个字符
    •        [a-z0-9]匹配任意小写字母或数字
    •        [^b-a]将会匹配范围在b~a之外的任意一个字符.这就是使用^对字符集取反的一个实例
    •        将多个中括号字符集组合使用,能够匹配一般的单词或数字,例如,[Yy][Ee][Ss]能够匹配yes,Yes,YES,yEs等
      •   下面来看第一个例子
        •   
          [root@localhost ~]# cat test 
          aa
          bb
          cc
          dd
          ee
          11
          22
          4
          55
          76
          77
          11
          tt

          [root@localhost ~]# grep "[^a-z]" test
          11
          22
          4
          55
          76
          77
          11

           


          从输出可以看出,精确匹配了test文件中所有非字符的内容

  •   \用来转义某个特殊含义的字符.这意味着,这个特殊字符将会被解释为字面含义例如:
    •   \$将会解释成字符$,而不是RE中匹配行尾的特殊字符.相似的,\\将会被解释为字符\.
    •        转义的尖括号\<...\>用于匹配单词边界,尖括号必须被转义才含有特殊的含义,否则他就表示尖括号的字面含义
    •        \<the\>完整匹配单词the,不会匹配them,there,other等.
    •        \{\}系列符号表示前一个字符的重复次数.
      •   \{n\}匹配前面的字符出现n次,如we\{3\}n匹配weeen
      •        \{n,\}匹配前面的字符至少出现n次,如we\{3\}n匹配weeen,weeeen,weeeeen
      •        \{n,m\}匹配前面字符出现n次与m次之间,如如we\{3.6\}n匹配weeen,weeeeeen等字符串
        •   例如:.[a-z]\{5\}匹配五个小写英文字母,如hello,house等
          •   继续看第二个例子
          • [root@localhost ~]# cat test2 
            test abc liveylinux
            
            rrrrrr
            
            iiiivey
            
            bkywwk
            
            yyyy1996
            
            golang 
            [root@localhost ~]# grep "\<test\>" test2 
            test abc liveylinux
            [root@localhost ~]# grep "r\{6\}" test2 
            rrrrrr
            [root@localhost ~]# grep "bkyw\{0,2\}k" test2 
            bkywwk
            [root@localhost ~]# grep "y\{4\}1996" test2 
            yyyy1996

            可以看出,grep都精准匹配出来了