原文地址:https://blog.csdn.net/keep_vitality/article/details/50270185
以下内容由于编辑器的原因,有些是用中文字符代替英文字符
(?=)正向向前查找 (?<=)正向向后查找
(?! )负向向前查找 (?<!)负向向后查找
1.(?=)正向前查找
向前查找指定了一个必须匹配但不在结果中返回的模式。向前查找实际上是一个子表达式,所以要用()括起来。向前查找模式其实就是一个以?=开头的字表达式,需要匹配的文本跟在=的后面。
后面会用到术语“消费”(consume),表示“匹配和返回文本”。在向前查找里,被匹配的文本不包含在最终返回的匹配结果里,这被称为“不消费”
看一个例子
文本 \http://www.baidu.com
正则表达式 .+(?=:)
匹配结果 \http://www.baidu.com
可以看到字表达式(?=:)匹配:,但被匹配的:没有出现在最终的匹配结果里,我们用?=向正则表达式引擎表明:只要找到:就行了,不要把它包括在最终结果里。用术语来说,就是”不消费”它。
2.(?<=)正向后查找
废话不多说,看个例子。
文本 d23.90 d12.32 d12.34 33.33
正则表达式 (?<=d)[0-9.]+
匹配结果 d23.9023.90 d12.3212.32 d12.3412.34 33.33
可以看到$没有出现在匹配结果里,也不会匹配到33.33。
注意:向前查找模式的长度是可变的,它们可以包含.、、+之类的元字符;而向后查找模式只能是固定长度,不能包含.、、+之类的元字符。
这句话的意思是值:(?<=t+)这种就是非法的!,而(?=t+)是合法的。
刚开始我以为是指子表达式后不能跟* +这种元字符,后来测试了一下发现是这个意思。
3.(?!)负向前查找
向前查找和向后查找通常用来匹配文本,通过指定匹配结果的前后必须是哪些文本来限定匹配结果文本的位置。术语”正“的意思是寻找匹配的事实。所以负向查找中的术语”负”是指不与给定模式向匹配的文本。相当于取非
看个例子
文本 the book cost and the phone cost 1000 2d
正则表达式\d+(?!d)
匹配结果the book cost and the phone cost 1000 2d
可以看到匹配的是不以$开头的数值。
4.(?<!d)负向后查找
举个例子
文本 the d2 wow 30
正则表达式 (?<!d)\d+
匹配结果 the d2 wow 30
5.向前查找向后查找混合使用
举个例子
文本(title)ben hah wowo(/title)
正则表达式 (?<=(title)).*(?=(/title))
匹配结果 (title)ben hah wowo(/title)
测试的过程中发现了一个不理解的例子
文本(title)ben hah wowo(/title)
正则表达式(?<!(title)).*(?!(/title))
匹配结果是 (title)ben hah wowo(/title) 和一个空格
…….待修改
(?<=)与(?=)哪个是前向哪个是后向容易混,可以这样记:<=箭头指向的方向相反。(虽然有点罗嗦,但也算一种方法吧,免得记错)