前后查找是指对某一位置的前后内容进行查找,匹配本身并不返回,而是用来确定正确的匹配位置。即一个必须匹配但不在结果中返回的模式(只匹配不消费)。
向前查找
语法
(?=pattern)
一个以?=开头的子表达式,需要匹配的文本跟在=的后面
例:匹配协议名
http://www.baidu.com
https://www.google.com
ftp://ftp.forta.com
正则表达式
.+(?=:)
结果
匹配到:http、https、ftp
解析
.+
匹配任意字符一次或多次。(?=:)
匹配:
,但:
不出现在结果中(不消费)。因为?=
向正则表达式引擎表明:只要找到:
的位置就好了,不要把它包括在最终的匹配结果里(不消费它)。结果值包含:
前面的字符
向后匹配
语法
(?<=pattern)
例:匹配价格
apple:¥2.99
banana:¥5.5
pitaya:¥100.21
正则表达式
(?<=¥)[0-9.]+
结果
匹配到2.99、5.5、100.21
解析
(?<=¥)
匹配到¥
但不出现在结果里(不消费),[0-9.]+
匹配0-9或.的任意一次或多次
组合前后查找
向前查找和向后查找可以组合在一起使用
例:只匹配标题文本
<title>hello world</title>
正则表达式
(?<=\<[tT][iI][tI][lL][eE]>).*?(?=</[tT][iI][tI][lL][eE]>)
结果
匹配到hello world
解析
(?<=\<[tT][iI][tI][lL][eE]>)
向后查找,匹配<title>但不消费它,为了减少歧义,title的做尖括号转译了。.*?
匹配到hello world。(?=</[tT][iI][tI][lL][eE]>)
向前查找,匹配到</title>,但不消费它。
对前后查找取非
对前后查找取非即负前后查找,它的意思是返回不与前后查找的给定模式相匹配的文本。
语法
负向前查找 (?!)
负向后查找 (?<!)
例:查找非价格数字
I paid $30 for 100 apples, 50 oranges.
I saved $5 on this order.
正则表达式
\b(?<!\$)\d+\b
结果
匹配到:100、50
解析
\d
匹配到数字,(?<!\$)
匹配到不以30中的0也会被匹配到。
网友评论