后向引用 分组进阶
分组标号
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
\b(\w+)\b\s+\1\b //表示重复的两个单词
\1 //表示第一个分组的东西
?: //可以剥夺对分组权利的分配
分组捕获
(exp) //创建一个分组,捕获文本到自动命名的分组里
(?<name>exp)或者(?'name'exp) //创建一个命名的分组,捕获文本到name名称的分组里
(?:exp) //匹配exp,不捕获也不给分组分配编号
零宽断言和负向零宽断言
(?=exp) //匹配表达式前边的位置//例如 \b\w+(?=ing\b) 匹配ing结尾的单词 breaking popping 则会匹配到break和popp
(?<=exp) //匹配表达式后边的位置//例如 \b(?<=re)\w+\b 匹配re开头的单词 reference和rebook 则会匹配ference和book
(?!exp) //匹配表达式前边的位置//例如 \b\w+(?=ing\b) 匹配不以ing结尾的单词
(?<!exp) //匹配表达式后边的位置//例如 \b(?<=re)\w+\b 匹配不以re开头的单词
注释
(?#comment) //进行注释 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#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部分
没有提到的知识点