zoukankan      html  css  js  c++  java
  • 正则表达式(进阶篇)

    后向引用  分组进阶

    分组标号

    使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

    (w+)s+1   //表示重复的两个单词

    1    //表示第一个分组的东西

    ?:    //可以剥夺对分组权利的分配

    分组捕获

    (exp)    //创建一个分组,捕获文本到自动命名的分组里

    (?<name>exp)或者(?'name'exp)    //创建一个命名的分组,捕获文本到name名称的分组里

    (?:exp)    //匹配exp,不捕获也不给分组分配编号

    零宽断言和负向零宽断言

     (?=exp)     //匹配表达式前边的位置//例如  w+(?=ing)  匹配ing结尾的单词   breaking popping  则会匹配到break和popp

     (?<=exp)     //匹配表达式后边的位置//例如  (?<=re)w+  匹配re开头的单词  reference和rebook 则会匹配ference和book

     (?!exp)     //匹配表达式前边的位置//例如  w+(?=ing)  匹配不以ing结尾的单词

     (?<!exp)     //匹配表达式后边的位置//例如  (?<=re)w+  匹配不以re开头的单词

     注释

     (?#comment)    //进行注释  2[0-4]d(?#200-249)|25[0-5](?#250-255)|[01]?dd?(?#0-199)

    贪婪与懒惰

    当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

    有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

    注意定义懒惰为:使整个匹配成功的前提下使用最少的重复

    处理选项

    上边的耐心看完意思其实就是igm这仨字母

    平衡组和递归匹配

    看到这里已经到了最后一个概念了,这个概念肯定相对陌生很多。

    举个例子((1+2+3)*(3+5)/(2+1+(3+3)/2))

    这里边有好多的相对的括号,那么可以说他们互相平衡了。就称之为平衡组,

     运用前边学的给分组命名的知识,那么希望一个分组开始一个结束的话,那么就一个命名的分组在结束时给一个负号的分组命名推出,这样就可以达到平衡

      • (?'group')           //把捕获的内容命名为group,并压入堆栈(Stack)
      • (?'-group')                 //从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
      • (?(group)yes|no)    //如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分

     

     没有提到的知识点

     

  • 相关阅读:
    【数论】线性模方程
    【数论】拓展欧几里得
    BZOJ1433: [ZJOI2009]假期的宿舍
    BZOJ2823: [AHOI2012]信号塔
    BZOJ1088: [SCOI2005]扫雷Mine
    BZOJ1257: [CQOI2007]余数之和sum
    BZOJ1227: [SDOI2009]虔诚的墓主人
    BZOJ1856: [Scoi2010]字符串
    BZOJ1084: [SCOI2005]最大子矩阵
    BZOJ2007: [Noi2010]海拔
  • 原文地址:https://www.cnblogs.com/sowhite/p/6358025.html
Copyright © 2011-2022 走看看