zoukankan      html  css  js  c++  java
  • 正则表达式基础

    正则表达式基础

    正则表达式定义

         正则表达式,Regular Expression,也常被简写为regex,regexp或RE.
         通常用一个正则表达式描述一个特征,然后去验证其他字符串是否符合这个特征.
         正则表达式也常被称作一个模式(pattern).
         
         PS:正则表达式精确的语法可能会因程序语言或工具的不同而有所差异.
         PPS:本文是学习之记录,如有不妥还望指正.
             
     

    普通字符和特殊字符

         字符分为普通字符和特殊字符.
         特殊字符也被称为元字符.
        
         普通字符匹配与自身完全相同的一个字符,如字母,数字等.
         什么样的字符叫普通字符呢?除了特殊的,就是普通的,所以本文后面提到的都是特殊的.
         通常有一些表可以查询:
     
         如何表示特殊符号本身?
         特殊字符前面加反斜杠()时表示自身.比如特殊字符^,$等,前面加上\,就表示这个符号本身.
         (可能正反斜杠不太容易记忆,所以可以记为右手斜杠).
         就是转义字符,普通加转义变成特殊的,如d;特殊加转义变成普通的,如$.
     

    常用元字符

         d匹配一位数字.(因为它是digit的首字母).
         w匹配字母或数字或下划线或汉字等.(联想tip:可能是”字”word的首字母).
         s匹配任意的空白符,包括空格,Tab,换行.(可能因为是space的首字母).
         代表单词分界处(比如空格,标点符号和换行等),不匹配这些符号,只匹配一个位置.(这个想不出为什么了,难道是begin?blank?).
         .匹配除了换行之外的任意字符.
     
         上面几个常用元字符的大写字母形式则是其反义,比如D匹配任意非数字的字符,其他W,S,B的意思可以类推.
     
         一些不便被表示的符号(非打印字符)用转义字符表示,如:
          , 代表回车和换行符.
          代表制表符.
         

    字符集 (中括号[]的使用)

         字符集合用方括号组织.
         []中可以罗列元素,如[aeiou]匹配任何一个原因字母.[]中可以包含任意多个字符,可以匹配其中任意一个,但是只能是一个.
         [^]是反向字符集,如[^xyz]匹配除了xyz之外的任意一个字符.
         正反向的字符集都可以划定范围.比如[0-9][0-9a-z][^A-F0-3]等等.
         但是永远要记得:不管方括号[]里面有多少内容,它永远都只匹配一个字符作为匹配内容.
         要匹配多个字符,需要用数量限定符.
     

    分组 (小括号()的使用)

         中括号介绍完了之后就是小括号了.
         小括号是用来分组的, ()符号:
         1.在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;
         2.取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到.
         总而言之,小括号标记了子表达式的开始和结尾,可以保存子表达式以备将来之用.
         
         小括号的另一种用途是通过语法(?#comment)来包含注释.
     
     

    指定数量的限定符 (大括号{}用在这里)

         *代表前面的内容出现0次到多次.
         +代表前面的内容出现1次到多次.
         ?代表前面的内容出现0次或1次.
         {n}代表前面的内容重复n次(不能多也不能少).
         {n,}代表前面的内容重复n次或更多次.
         {n,m}代表前面的内容重复n到m次.
         
         正则表达式默认是贪婪匹配,即匹配尽可能多的字符,比如a.*b它会匹配以a开始,以b结束的最长的字符串.
         但是有时候我们需要懒惰匹配(非贪婪匹配),也即匹配尽可能少得字符,要实现这个效果,只要在数量限定符的后面跟上一个问号?.
      这样a.*?b会匹配以a开始,以b结束的最短的字符串.
     
     

    匹配

        一般的正则匹配:当被检测的字符串包含的某个部分符合正则表达式的描述时,称为匹配成功;符合匹配的部分即是匹配到的内容. 
         但是如果加上^$限定匹配字符串的开头和结尾,则必须是整个字符串匹配,匹配才能成功.
         比如d是表示数字,d{5,12}只能保证字符串里包含5到12连续位数字,而^d{5,12}&则保证整个字符串就是5到12位数字.
         ^,$都是用来进行边界匹配的,它们本身并不匹配任何字符.
     

    分支条件

         用|可以把不同的规则分隔开.左右两边表达式是或的关系,即匹配左边或者右边,可以在多个项之间进行选择.
         匹配分支条件时会采取短路原则,即如果前面某个分支已经满足,则不会再测试后面的分支条件.
     
     

    后向引用

         前面介绍的小括号的使用,用来分组,以备后续使用,这里就要介绍怎么使用.
         表达式在匹配的时候,会将小括号包含的表达式所匹配到的字符串记录下来,在获取匹配结果的时候,小括号表达式匹配的字符串可以单独获取.
         小括号匹配到的字符串,不仅是在匹配结束后才能使用,在匹配过程中也可以使用.
         这样就可以匹配重复出现的单词等.
     
         表达式后面的部分,可以引用前面”括号内的子匹配已经匹配到的字符串”,引用方法是反斜杠加上一个数字.
         1引用第一对括号内匹配到的字符串, 2引用第二对. 比较特殊的是分组0对应整个正则表达式.
         如果有嵌套的括号,则外层的括号先排序号(即按照左括号的顺序排序).
     
         也可以自己指定子表达式的组名,语法是:(?<name>exp),其中<>换成单引号也行.
         引用自己指定名字的子表达式:k<name>
         组号分配时扫描两遍,第一遍给未命名的组分配,第二遍给命名了的组分配组号.
         使用(?:exp)将不捕获匹配的文本,也不给此组分配编号.
         
     

    零宽断言和负向零宽断言

         断言指定了一个条件(可能是正向条件或者负向条件),然后零宽表示所占宽度为零,即自身并不被包含在匹配结果里,就好像,^,$等.
         两个正向条件的, 即零宽断言:
         (?=exp)零宽度正预测先行断言,它断言自身出现的位置后面能匹配表达式exp.
              比如w+(?=ing),匹配以ing结尾的单词的前面部分.
         (?<=exp)零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp.
              比如(?<=re)w+会匹配以re开头的单词的后半部分.
         两个负向条件的, 即负向零宽断言:
         (?!exp)零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp.
              比如d{3}(?!d)匹配三位数字,而且这三位数字的后面不能是数字.
         (?<!exp)零宽度负后顾后发断言,断言此位置的前面不能匹配表达式exp.
              比如(?<![a-z]d{7})匹配前面不是小写字母的七位数字.
         
         
         
     

    参考资料

         正则表达式30分钟入门教程:
         wikipedia:
         揭开正则表达式的神秘面纱:
         msdn正则表达式语法:
     
     
         正则表达式测试网站:
         多种语言的正则表达式在线测试:
         JavaScript正则测试:
         regex101:
         正则表达式状态机生成器:
     
     
     
     
  • 相关阅读:
    常用控件(1)—RadioGroup、CheckBox、Toast
    调用系统剪切板并传输到OtherActivity
    Linux 文件类型
    Handler应用3 — 与Activity不同一线程
    linux下tftp(解决Loading问题 transfer timed out)
    c/c++ 中const的作用
    C++ 初步知识
    类外定义成员函数实例
    ubuntu上Samba服务器配置
    Android全面开发——问题汇总
  • 原文地址:https://www.cnblogs.com/mengdd/p/4177870.html
Copyright © 2011-2022 走看看