9.1 前后查找
用正则表达式标记要匹配的文本的位置(而不仅仅是文本本身)。
前后查找(lookaround),对某一位置的前、后内容进行查找。
例子:把一个web页面的页面标题提取出来。
?<=\<[tT][iI][tT][lL][eE]>.*?=</[tT][iI][tT][lL][eE]>
9.2 向前查找(正向前查找positive kookahead)
向前查找指定了一个必须匹配但不在结果中返回的模式。
?=将向前查找(查找出现在被匹配文本之后的字符,但不消费这个字符)。
一个向前查找的其实就是一个以?=开头的子表达式,需要匹配的文本跟在=以后。
例子:把URL中协议名部分提取出来(为下一步处理做准备)。
.+(?=:)
只要匹配到:就可以了,但不出现在匹配的结果里,用术语表达就是“不消费”。
备注:向前查找(或向后查找)匹配本身其实是有返回结果的,知识这个结果的字节长度永远是0而已。
因此,前后查找操作有时也被称为零宽度(zero-width)匹配操作。
提示:任何一个子表达式都可以转换为一个向前查找表达式,只要给它加上一个?=前缀即可。
在同一个搜索模式里可以使用多个向前查找表达式,他们可以出现在模式里的任意位置。
9.3 向后查找(正向后查找positive lookbehind)
?<=向后查找,查找出现在被匹配文本之前的字符(但不消费它。)
备注:向前查找模式的长度是可变的,它们可以包含.和+之类的元字符,非常灵活。
而向后查找模式只能是固定长度,这是一条几乎所有正则比到达时实现都遵循的限制。(不是所有的语言都支持向后查找)
9.4 把向前和向后查找结合起来
向前和向后查找可以组合在一起使用。
9.5 对前后查找取非
负向前查找(negative lookahead)将向前查找不与给定模式相匹配的文本。?!
负向后查找(negative lookbehind)将向后查找不与给定模式相匹配的文本。?<!