LINUX-初学正则表达式

正则表达式

  

简介

      REGEXP:由一类特殊字符及文本字符由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
                   不表示字符字面意义,而表示控制或通配的功能。

      程序支持:grep,sed,awk,vim,less,nginx,varnish等,下面将介绍grep中正则表达式的用法。

      正则表达式分基本正则表达式(BRE)和扩展正则表达式(ERE)

     正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)

     元字符分类:字符匹配、匹配次数、位置锚定、分组

 

BRE元字符

      字符匹配:


                  .                              匹配任意单个字符

                 []                            匹配指定范围内的任意单个字符  

                [^]                          匹配指定范围外的任意单个字符


              [:alnum:]                     字母和数字,即a-z,A-Z,0-9


              [:alpha:]                      代表任何英文大小写字符,即a-z,A-Z

              [:lower:]                       小写字母 ,即a-z

              [:upper:]                      大写字母,即A-Z


              [:blank:]                       空白字符(空格和制表符)

              [:space:]                      水平和垂直的空白字符,包括空格键,[tab],CR等


              [:digit:]                        十进制数字  ,即0-9

              [:xdigit:]                       十六进制数字,包括:0-9,A-F,a-f的数字与字符


              [:cntrl:]                         不可打印的控制字符(退格、删除、警铃…)

              [graph:]                        可打印的非空白字符(空格键与[tab]按键外的其他所有按键 

              [:print:]                         任何可以被打印出来的字符

              [:punct:]                       标点符号,即 : “  ‘  ? ! ; :#  $….

 匹配次数:

         用在要指定次数的字符后面,用于指定前面的字符要出现的次数

     


        *          匹配前面的字符任意次,包括0次(贪婪模式:尽可能长的匹配)


       .*          任意长度的任意 。                   例如:a*,可以表示a,aa,aaa,aaaaa,aaaa…a.


       \?          匹配其前面的字符0或1次 。      例如:ab\?c ,表示ac,abc


       \+          匹配其前面的字符至少一次 。   例如:ab\+c  表示abc,abbc,abbbc等。 \+匹配前面一个字符

                                                                                  最少1次,最多任意次,不包括0次。


      \{n\}       匹配前面的字符n次。               例如: ab\{2\}c ,表示在a与c之间有两个b,

                                                                              即abbc


    {m,n}     匹配前面的字符至少m次,至多n次 。  例:ab{1,3} c,表示在a与c之间有1个到3个b,即                                                                                                      abc,abbc,abbbc


      \{,n\}      匹配前面的字符至多n次             例:ab\{,3\}c,表示ac,abc,abbc,abbbc。

                                                                          最多3次,可以包括0次。 


      {m,}     匹配前面的字符至少m次             例:ab{2,}c,表示a与c之间最少有2个b,即                                                                                                               abbc,abbbc,abbbbc,abbb…c


  

      示例:在/app下先创建一些文件,运用BRE中匹配次数,进行简单的操作。如下图



                 LINUX-初学正则表达式 


 

位置锚定:

         定位出现的位置


           ^               行首锚定,用于模式的最左侧           例:^content,匹配行首为content的行    


          $                 行尾锚定,用于模式的最右侧           例:txt$,匹配行末为txt结尾的行;^$匹配空白行


    ^PATTERN$        用于模式匹配整行 ;^$匹配空行;^[[:space:]]*$匹配空白行


      \< 或 \b           词首锚定,用于单词模式的左侧       例:\<th匹配… this…,但不匹配tenth等


       \> 或 \b          词尾锚定;用于单词模式的右侧       例:p\>匹配leap,但不匹配parent等


    \<PATTERN\>     匹配整个单词        例:\bat\b 匹配… at …, 但不匹配 cat 、batch等


      

 下面我们在/etc/passwd文件中,运用BRE位置锚定来过滤查看一些文件的内容。如下图


                    LINUX-初学正则表达式

   从上图中可以看出,^$,^[[:space:]]$只匹配空行;\<bash\>,只匹配带有整个单词bash的行,不匹配包含bash单词的     行,如sbin的行。


分组:

        \(\) 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+  ;
        分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …; 
       \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符。
            
       后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身 

                      示例:\(root\)*\1

       下面通过一些例子来简单介绍分组的基本用法,还是以/etc/passwd文件为例。如下图:

                

                 LINUX-初学正则表达式

      上图中:第一个组\(daemon\) ,\1表示调用第一个组匹配到的字符,不是模式本身;虽然都是daemon,但是意思不   一样。\2表示调用第二个组匹配到的字符。

                      

                   LINUX-初学正则表达式

或者:\| 
       示例:a\|b: a或b  C\|cat: C或cat   \(C\|c\)at:Cat或cat

     例:在/app下创建a、 b、 act、 bct、 cct、 dct 六个文件,运用正则表达式元字符或者,来进行些简单操作。如下图:

               LINUX-初学正则表达式

扩展正则表达式

  元字符:  
    字符匹配: 
          . 任意单个字符 
         [] 指定范围的字符 
         [^] 不在指定范围的字符
     
    位置锚定: 
           ^  :行首 
           $  :行尾 
       \<, \b :语首
       \>, \b :语尾  
   
    
    次数匹配:
       *:匹配前面字符任意次 
       
       ?: 0或1次 
       +:1次或多次 
     {m}:匹配m次 
    {m,n}:至少m,至多n次

    分组: 
       () 后向引用:\1, \2, …  
   
   或者: a|b: a或b     C|cat: C或cat 
         (C|c)at:Cat或cat

扩展正则表达式与基本正则表达式用法差不多;区别在于反斜杠”\“的不同。基本正则表达式元字符中,次数匹配,分组和或者都加反斜杠”\“;

而扩展正则表达式中,次数匹配,分组和或者都不需要加”\“。具体用法参考基本正则表达式,这里就不举例说明了。  

     

原创文章,作者:shenjialong,如若转载,请注明出处:http://www.178linux.com/77432

(0)
shenjialongshenjialong
上一篇 2017-06-04
下一篇 2017-06-04

相关推荐

  • vsftpd

    vsftpd:     程序环境:         配置文件:/etc/vsftpd/vsftpd.conf         主程序:/usr/sbin/vsf…

    Linux干货 2016-12-05
  • N22-妙手-第七周博客作业第四题:RAID各级别的特性

    什么是RAID RAID的全称是Redundant Array of Independent Disks – 独立磁盘冗余阵列。基本思想是将多个相对便宜的硬盘组合成为一个硬盘阵列,使其在性能上达到或超过一块价格昂贵、容量巨大的硬盘。RAID通常被用在服务器上,使用完全相同的硬盘组成一个逻辑扇区,因此操作系统会把其当做一块硬盘。RAID分为不同的等…

    Linux干货 2016-09-27
  • 网络互联参考模型(详解)

    网络互联参考模型 1. 什么是协议 为了使数据可以在网络上从源传递到目的地,网络上所有设备需要“讲”相同的“语言” 描述网络通信中“语言”规范的一组规则就是协议 例如:两个人交谈,必须使用相同的语言,如果你说汉语,他说阿拉伯语…… 数据通信协议的定义 决定数据的格式和传输的一组规则或者一组惯例 2. 协议分层 网络通信的过程很复杂: 数据以电子信号的形式穿越…

    Linux干货 2015-05-07
  • n28-第四周

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限 答:install 复制文件并设置属性 -d, –directory:复制所有参数为目录名 -m, –mode=MODE:设置文件属性,相当于chmod # install -d -m u=rwx /e…

    Linux干货 2017-12-24
  • bind-9.9.5编译安装

    bind-9.9.5编译安装 §·bind-9.9.5编译安装大概步骤 步骤一 :下载源码包bind-9.9.5 ; 步骤二 :按需求选择模块或功能 ./configure ;  # ./configure  –prefix=/usr/local/bind9  –sysconfdir=…

    Linux干货 2016-10-09
  • vim的基本使用

    前言:     Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。VIM是自由软件。    Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Linuxworld文本…

    Linux干货 2017-07-30