正则表达式的高级用法——正|反向预查

软件工
• 阅读 8383

我之前一直自诩精通正则表达式(毕竟我实现过正则引擎),但关于正则表达式有几个特殊用法我一直都不熟,一来是用的少,二来确实也没花心思学过。正好这两天有需要用到预查的功能,索性就学习整理出今天的博文。

介绍下今天的4位主角 ?=、?<=、?!、?<!,估计大多数人都面生。我们小学二年级就知道 正则表达式 是用来做字符串匹配的,核心在于匹配 二字。以往我们见到的正则表达式都是直接匹配出某些内容,而和?=、?<=、?!、?<!相关的正则表达式却只是辅助匹配,它们本身不会匹配出任何内容,像这类的正则表达式我们也称之为零宽断言,它们存在的意义也只是为了定位。
正则表达式的高级用法——正|反向预查
举个例子大家就清楚了,假设你让你去书架上找本白色封面200多页的小说,这句话就是用来匹配书的模式。当然书架上白色封面200多页的小说 有好多本,我想进一步缩小范围。我想要放在《编译原理》左边的白色封面200多页的小说,这里我提到了《编译原理》找本书,但是我并不想要它,它只是起到定位作用。在正则表达式中起定位作用但不匹配的,就是今天要讲的?=、?<=、?!、?<!

?=

我们挨个来看下这几个正则语法的用法,首先是?=,用法是exp1(?=exp2),查找出现在exp2前面的exp1,exp2是不会出现在结果里的,如下图。
正则表达式的高级用法——正|反向预查
这里我特意用了fiction和compiler俩词,小说和编译,字符串中有两个fiction,分别在compiler的左右两侧,fiction(?=compiler)只匹配到了第一个fiction,(?=compiler)对其做了定位限制。 和上面所举的例子对应上就是 找一下放在《编译原理》左边的小说

?!

?!?=是一对,?!?=的否定语义,用法是exp1(?!exp2),其意义是不是出现在exp2前面的exp1。我们直接将上图中的 ?=改成?!,那它就只会匹配到右边的fiction了,对应的就是不在《编译原理》左边的小说
正则表达式的高级用法——正|反向预查

?!?=是按照右侧模式去定位,正则表达式作为一个设计成熟的工具,必然也会有与之对应的左侧定位,那就是 ?<=?<!,同理它俩也是一对。

?<=

?<=?= 用法恰好反过来,?<=要放在匹配内容的前面,比如:(?<=exp2)exp1,其作用是匹配exp2后面的exp1,我们还是以compiler和fiction为例,这次我们将字符串中的compiler和fiction换个位置,正则表达式也换成?<=,其作用就变成了查找放在《编译原理》右边的小说
正则表达式的高级用法——正|反向预查

?<!

?<!?<= 的否定模式,用法同?<=(?<!exp2)exp1,其作用是匹配不在exp2后面的exp1,用法我就不再赘述了,直接看图,该正则表达式没有匹配第一个fiction,而是匹配到了第二个fiction。 正则表达式的高级用法——正|反向预查

结语

正则表达式是一个极其有用的工具,我个人经历,精通正则表达式可以为日常工作提效不少,比如简单的日志清晰,简单的数据统计…… 正则表达式加其他linux命令行工具,可以提效非常多。举个不那么正经的例子,比如我要下个美剧,视频网站上几十集都是分开的链接,正常人估计都是复制粘贴到下载器,重复20多次,不仅麻烦而且可能有遗漏或重复。而我的操作,打开网页源码 正则表达式一匹配,批量复制粘贴,完事。
另外正则表达式也是非常有趣的工具,不信你可以看下我之前写的几篇相关博客。
用正则表达式来检测一个数是否是素数
用正则表达式匹配3的任意倍数
手撸正则引擎

点赞
收藏
评论区
推荐文章
墨冰 墨冰
4年前
学习无止境,我总结了一份“正则表达式”大全供你使用
学习不打烊,充电加油只为遇到更好的自己。希望大家如果觉得好的话可以点赞,评论鼓励一下。最近博主学习了正则表达式,感觉这个正则表达式的学习也非常必要,然后我就花了一点时间帮大家总结了常用的正则表达式供大家学习使用。如果有需要一定要收藏起来呀,方便之后在进行相应字符匹配的时候使用。正则表达式测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串
Python进阶者 Python进阶者
3年前
盘点Python正则表达式中的贪婪模式和非贪婪模式
大家好,我是我是皮皮。一、前言前几天在Python最强王者交流群有个叫【杰】的粉丝问了一个关于Python正则表达式的问题,其中涉及到Python正则表达式中的贪婪模式和非贪婪模式,讨论十分火热,这里拿出来给大家分享下,一起学习。二、解决过程这里分享【小王】大佬的解答,一起来看看吧,下面是他给的一个示例代码。importretxt"Thisis
Karen110 Karen110
4年前
再见,正则表达式
从一段指定的字符串中,取得期望的数据,正常人都会想到正则表达式吧?写过正则表达式的人都知道,正则表达式入门不难,写起来也容易。但是正则表达式几乎没有可读性可言,维护起来,真的会让人抓狂,别以为这段正则是你写的就可以驾驭它,过个一个月你可能就不认识它了。完全可以说,天下苦正则久矣。今天给你介绍一个好东西,可以让你摆脱正则的噩梦,那就是Python中一个
Stella981 Stella981
4年前
Python爬虫:现学现用xpath爬取豆瓣音乐
爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能三种爬虫方式的对比。!(https://oscimg.oschina.net/oscnet/2daa493a02eeb49299b1ab6db462cb42124.png)这样一比较我我选择了Lx
Wesley13 Wesley13
4年前
Java中正则表达式的一些特殊用法
最近在研究数据库迁移工具,阅读源码的过程中学习了一些正则表达式的特殊用法,于是记录一下。@Testpublicvoidtest(){Stringsql"CREATETABLEtest_table(\n""idint(11)
Stella981 Stella981
4年前
Golang(四)正则表达式使用
0\.前言最近用到了regexp包,下面整理下正则表达式相关用法参考 基础知识Golang中的正则表达式(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fgolove%2Fp%2F3269099.htm
Stella981 Stella981
4年前
Python正则表达式用法详解
搞懂Python正则表达式用法Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函
Stella981 Stella981
4年前
Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识。关于正则表达式的语法,不作过多解释,网上有许多学习的资料。这里主要介绍Python中常用的正则表达式处理函数。re.matchre.match尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。!复制代码(http://static.oschina.net
Stella981 Stella981
4年前
AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式
1、Java中过滤出字母、数字和中文的正则表达式(1)过滤出字母的正则表达式\^(AZaz)\(2)过滤出数字的正则表达式\^(09)\(3)过滤出中文的正则表达式\^(\\\\u4e00\\\\u9fa5)\(4)过滤出字母、数字和中文的正则表达式\^(azAZ09\\\\u
Stella981 Stella981
4年前
JavaScript中的正则表达式详解
摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法。正则表达式(RegularExpression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。正则表达式在人们的印象中可能是一堆无法理解的字符,但就是这些符号却实现
Python进阶者 Python进阶者
2年前
盘点一个Python正则表达式的问题
大家好,我是皮皮。一、前言前几天在Python白银群【whoisme】问了一个Python正则表达式的问题,这里拿出来给大家分享下。下图是他的正则表达式:二、实现过程这个正则表达式还是蛮复杂的,在Python中,正则表达式中的问号?表示前面的字符出现0次或