正则表达式(进阶篇)

后向引用  分组进阶

分组标号

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

 

 没有提到的知识点

 

原文地址:https://www.cnblogs.com/sowhite/p/6358025.html