正则分组,零宽断言和贪婪懒惰模式

一直以来,使用正则表达式的机会很多,常常用来作一些字符串处理工做,仍是比较方便的,不过对于断言和贪婪懒惰模式的认识一直比较模糊。最近咱们后端组在协做开发一个对外的后台项目,前端的接口文档是用word写了(汗-_-||,很难用啊,仍是markdown比较好)里面有一个接口列表的表格,这里的接口列表须要提取出来,造成一个权限链路作权限控制,减小ajax的RBAC权限配置的臃肿。这里我用了正则表达式来完成,作完以后我对正则表达式的理解和使用也算是小成了,下面我就说一下正则表达式几种常见用法个人理解。前端

网上有《正则表达式30分钟入门教程》珠玉在前,基础知识我就很少说了,你们本身去看。ajax

分组

一、对于一些有必定模式或者以必定规律出现的字符串,咱们想要匹配而且捕获到它们; 二、这些字符串咱们不但要匹配捕获到它们,还要向后引用进行例如替换之类的处理; 正则表达式中分组的单位用(exp)小括号来区分,里面exp就是要匹配的内容。正则表达式

匹配ip地址xxx.xxx.xxx.xxx能够写成如下形式后端

\d{1,3}(\.\d{1,3}){3}

匹配少数民族的真实姓名markdown

[\x{4e00}-\x{9fa5}]+(·[\x{4e00}-\x{9fa5}]+)*

(此处贴个毕加索的全名。。。[巴勃罗·迭戈·荷瑟·山迪亚哥·弗朗西斯科·德·保拉·居安·尼波莫切诺·克瑞斯皮尼亚诺·德·罗斯·瑞米迪欧斯·西波瑞亚诺·德·拉·山迪西玛·特立尼达·玛利亚·帕里西奥·克里托·瑞兹·布拉斯科·毕加索]url

而正则表达式中默认第0个分组是匹配到整条正则表达式的字符串spa

分组命名:code

咱们还能够给分组进行命名,方便区分教程

(?<name>exp)

匹配到exp的内容就会捕获到一个命名为name的分组里面,不影响原来的索引分组状况,也能够写成索引

(?'name'exp)

在向后引用中,咱们可使用 \n 或者 $n 来引用匹配到的分组内容,即第n个出现的小括号。

不捕获:

在正则表达式中,咱们能够选择关闭对不须要的内容的捕获,就是不捕获,以此来提升正则表达式的执行速度和节约内存使用。 语法是:

(?:exp)

零宽断言

零宽,顾名思义,就是没有宽度,匹配到的字符串不会被捕获。 断言,就是true or false。

下面是4种断言的说明:

名称 语法 说明
零宽度正先行断言 (?=exp) 匹配到exp则中止
零宽度负先行断言 (?!exp) 匹配不到exp则中止
零宽度正后发断言 (?<=exp) 匹配到exp则继续
零宽度负后发断言 (?<!exp) 匹配不到exp则继续

ps:千万傻傻别去的记名称,理解用法最重要

零宽断言只是用来判断是否符合继续匹配的条件,并不会找到真正须要的字符串,自己并不会匹配字符

例如,在爬虫中咱们可能须要匹配某些图片url,咱们就能够用断言来获取图片url。

贪婪和懒惰模式

正则表达式中默认的行为是在整个表达式可以匹配的前提下,匹配尽量多的字符,这称之为贪婪模式。 不过有时候,咱们还在整个表达式匹配的前提下尽量少的匹配字符,这就须要用到懒惰模式了。 懒惰模式的语法也简单,只须要在你所需匹配的字符后面再加一个?便可。

语法 说明
*? 重复任意次,但尽量少重复
+? 重复1次或更屡次,但尽量少重复
?? 重复0次或1次,但尽量少重复
{n,}? 重复n次以上,但尽量少重复

解释:懒惰模式就是在你设想字符可能出现的次数中,尽量匹配少的次数。

相关文章
相关标签/搜索