一、反向引用
刚看到这个词语我迷糊了半天,使用小括号指定一个子表达式, 匹配这个子表达式的文本可以表达式或者其他文本中进一步处理。看到上面这句话是不是晕了。如果晕了就对了,下面我就用自己的话说一下。
就是前面出现的语句后面也可以出现,并且后面出现能够根据前面出现指定的顺序。
默认情况下,每个分组会自动拥有一个组号,规则是从左向右,以分组的左括号为标志。
你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>
举个例子:如下
表达式的意思是:
首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。
二、断言
(1)零宽断言
一句话: 指定满足一定条件的位置
先行断言:就是断言自身出现位置的后面 (?=exp)
后发断言: 断言自身出现位置的前面 (? <= exp)
(二) 负向零宽断言
解决问题:查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u
\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的单词
三、贪婪和懒惰
贪婪匹配 :当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。
如果用它来搜索aabab的话,它会匹配整个字符串aabab。。
懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)