乐趣区

关于java:正则表达式的高级用法正反向预查

我之前始终自夸精通正则表达式(毕竟我实现过正则引擎),但对于正则表达式有几个非凡用法我始终都不熟,一来是用的少,二来的确也没花心思学过。正好这两天有须要用到预查的性能,索性就学习整顿出明天的博文。

介绍下明天的 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 的任意倍数
手撸正则引擎

退出移动版