正则表达式教程之前后查找lookaround详解

发布时间 - 2026-01-10 22:24:11    点击率:

本文实例讲述了正则表达式教程之前后查找lookaround。分享给大家供大家参考,具体如下:

注:在所有例子中正则表达式匹配结果包含在源文本中的之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。

一、问题引入

在HTML页面中,匹配出一对标签之间的文本,如匹配出页面的标签,即<title>与</title>之间的文本:

文本:<head><TITLE>welcome to my page</title></head>

正则表达式:<[Tt][Ii][Tt][Ll][Ee]>.*?</ [Tt][Ii][Tt][Ll][Ee]>

结果:<head>【<TITLE>welcome to my page</title>】</head>

分析:<[Tt][Ii][Tt][Ll][Ee]>表示不区分大小写,这个模式匹配到了title标签以及它们之间的文本,但是并不完美,因为我们只想要title标签之间的文本,而不包括标签本身。解决这个问题我们就需要用到前后查找(lookaround)。

二、向前查找

向前查找指定了一个必须匹配但不在结果中返回的模式。向前查找实际上就是一个子表达式,它以?=开头,需要匹配的文本跟在=的后面。

看一个匹配出一个URL地址中协议部分的例子:

文本:http://blog.csdn.net/mhmyqn

正则表达式:.+(?=:)

结果:【http】://blog.csdn.net/mhmyqn

分析:URL地址中协议部分是在:之前的部分,模式.+匹配任意文本,子表达式(?=:)匹配:,但是被匹配到的:并没有出现在结果中。我们使用?=向正则表达式引擎表明,只要找到:就行了,但不包括在最终的返回结果里。这里如果不使用向前匹配(?=:),而是直接使用(:),那么匹配结果就会是http:了,它包括了:,并不是我们想要的。

注意:前后查找中的前、后是指模式与被查找文本的相对位置而言的,左为前,右为后。即向前查找为:xxx(?=xxx),而向后查找为(?<=xxx)xxx,向后查找在接下来会介绍到。

三、向后查找

向后查找操作符是?<=。但是并不是所有的正则表达式实现都支持向后查找,JavaScript就不支持,java语言支持向后查找。

比如要查找文本当中的价格(以$开头,后面跟数字),结果不包含货币符号:

文本:category1:$136.25,category2:$28,category3:$88.60

正则表达式:(?<=\$)\d+(\.\d+)?

结果:category1:$【136.25】,category2:$【28】,category3:$【88.60】

分析:(?<=\$)模式匹配$,\d+(\.\d+)?模式匹配整数或小数。从结果可以看出,结果不没有包括货币符号,只匹配出了价格。如果不使用向后查找,情况会是什么样呢?使用模式$\d+(\.\d+)?,这样会把$包含在结果中。使用模式\d+(\.\d+)?,又会把categery1(23)中的数字也匹配出来,都不是我们想要的。

注意:向前查找模式的长度是可变的,它们可以包含.、*、+之类的元字符;而向后查找模式只能是固定长度,不能包含.、*、+之类的元字符。

四、把向前查找和向后查找结合起来

把向前查找和向后查找结合起来使用,即可解决前面HTML标签之间的文本的问题:

文本:<head><TITLE>welcome to my page</title></head>

正则表达式:(?<=<[Tt][Ii][Tt][Ll][Ee]>).*?(?=</ [Tt][Ii][Tt][Ll][Ee]>)

结果:<head><TITLE>【welcome to my page】</title></head>

分析:从结果可以看出,问题完美的解决了。(?<=<[Tt][Ii][Tt][Ll][Ee]>)是一个向后操作,它匹配<title>但不消费它,(?=</[Tt][Ii][Tt][Ll][Ee]>)是一个向前操作,它匹配</title>但不消费它。最终返回的匹配结果只包含了标签之间的文本了。

五、对前后查找取非

前面说到的向前查找和向后查找通常都是用来匹配文本,其目的是为了确定将被返回的匹配结果的文本的位置(通过指定匹配结果的前后必须是哪些文本)。这种用法叫正向前查找和正向后查找。还有一种负向前查找和负向后查找,是查找那些不与给定模式相匹配的文本。

前后查找的操作符:

(?=) 正向前查找
(?!) 负向前查找
(?<=) 正向后查找
(?<!) 负向后查找

比如一段文本中即有价格(以$开头,后面跟数字)和数量,我们要找出价格和数量,先来看查找价格:

文本:I paid $30 for 10 apples, 15 oranges, and 10 pears. I saved $5 onthis order.

正则表达式:(?<=\$)\d+

结果:I paid 【$30】 for 10 apples, 15 oranges, and 10 pears. I saved 【$5】 on thisorder.

查找数量:

文本:I paid $30 for 10 apples, 15 oranges, and 10 pears. I saved $5 onthis order.

正则表达式:\b(?<!\$)\d+\b

结果:I paid $30 for 【10】 apples, 【15】 oranges, and 【10】pears. I saved $5 on this order.

分析:(?<!\$)表示一个负向后查找,它使得结果只包含那些不以$开头的数值。

六、小结

有了前后查找,就可以对最终的匹配结果包含哪些内容做出精确的控制。前后查找操作使我们可以利用子表达式来指定文本匹配操作发生的位置,并收到只匹配不消费的效果。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools./regex/javascript

正则表达式在线生成工具:
http://tools./regex/create_reg

希望本文所述对大家正则表达式学习有所帮助。


# 正则表达式  # 前后查找  # lookaround  # 正则表达式查找相似单词的方法  # 学习Java正则表达式(匹配、替换、查找)  # 正则表达式匹配  # 替换  # 查找  # JAVA中正则表达式匹配  # 切割的方法  # js正则查找match()与替换replace()用法实例  # Powershell学习笔记--使用正则表达式查找文件  # 如何在PHP中使用正则表达式进行查找替换  # 用正则查找html中有id属性的html标签  # 正则表达式验证IPV4地址功能实例分析  # 正则表达式教程之子表达式用法分析  # 正则表达式教程之位置匹配详解  # 正则表达式教程之重复匹配详解  # 正则表达式教程之操作符及说明详解  # 是一个  # 但不  # 可以看出  # 结合起来  # 就会  # 是在  # 出了  # 都在  # 就不  # 是指  # 出现在  # 会在  # 说到  # 而不  # 给大家  # 将被  # 就可  # 使我  # 要找 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中配置站点IP、端口及主机头?  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何快速辨别茅台真假?关键步骤解析  Bootstrap整体框架之CSS12栅格系统  Laravel如何生成URL和重定向?(路由助手函数)  太平洋网站制作公司,网络用语太平洋是什么意思?  WEB开发之注册页面验证码倒计时代码的实现  在线教育网站制作平台,山西立德教育官网?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何在阿里云高效完成企业建站全流程?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  大同网页,大同瑞慈医院官网?  长沙企业网站制作哪家好,长沙水业集团官方网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在IIS服务器上快速部署高效网站?  Android仿QQ列表左滑删除操作  Python3.6正式版新特性预览  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何在腾讯云服务器上快速搭建个人网站?  EditPlus中的正则表达式实战(5)  使用C语言编写圣诞表白程序  详解Android——蓝牙技术 带你实现终端间数据传输  如何在阿里云通过域名搭建网站?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  详解vue.js组件化开发实践  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何实现模型的全局作用域?(Global Scope示例)  微信小程序 五星评分(包括半颗星评分)实例代码  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  java中使用zxing批量生成二维码立牌  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  高性价比服务器租赁——企业级配置与24小时运维服务  如何在宝塔面板中修改默认建站目录?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  在Oracle关闭情况下如何修改spfile的参数  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  昵图网官方站入口 昵图网素材图库官网入口  Laravel项目怎么部署到Linux_Laravel Nginx配置详解