我是靠谱客的博主 义气西装,最近开发中收集的这篇文章主要介绍正则表达式之环视功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

正则表达式之环视功能

概述

正则表达式,又称规则表达式。(Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

环视,在不同的地方又称之为零宽断言,简称断言。

环视强调的是它所在的位置,前面或者后面,必须满足环视表达式中的匹配情况,才能匹配成功。

环视结构不匹配任何字符,只匹配文本中的特定位置。一种类型的环视叫“顺序环视(lookahead)”,作为表达式的一部分,顺序环视顺序(从左至右)顺序查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息。

肯定型顺序环视(positive lookahread)用特殊序列(?=……)来表示,例如(?=d),它表示如果当前位置右边的字符是数字则匹配成功。另一种环视称为逆序环视,它逆序(从右向左)查看文本。它用特殊的序列(?<=……)表示,例如(?<=d),如果当前位置的左边有一位数字,则匹配成功(也就是说,紧跟在数字后面的位置)。

四种类型的环视

类型正则表达式匹配成功的条件
肯定逆序环视(?<=……)子表达式能够匹配左侧文本
否定逆序环视(?<!……)子表达式不能匹配左侧文本
肯定顺序环视(?=……)子表达式能够匹配右侧文本
否定顺序环视(?!……)子表达式不能匹配右侧文本

1.肯定顺序环视(?=……),如果Jeff右侧的字符是数字就能匹配到Jeff:
在这里插入图片描述

2.否定顺序环视(?!……),如果Jeff右侧的字符不是数字就能匹配到Jeff:

在这里插入图片描述

需要注意的是Jeff右侧没有字符也匹配了,所以‘(?!d)’和‘D’是不同的,‘D’表达的是除数字外的任何字符,但前提是要有这个字符:

在这里插入图片描述

3.肯定逆序环视(?<=……), 如果ery左侧的字符是Jeff就能匹配到ery:

在这里插入图片描述
(ps:由于RegExr上不支持逆序环视,故换了一个网址)

4.否定逆序环视(?<!……),如果ery左侧的字符不是Jeff就能匹配到ery:

在这里插入图片描述

环视不会“占用”字符

即在子表达式能否匹配的过程中,它们本身不会“占用”任何文本。
正则表达式Jeffery的匹配:

by Jeffery Friend.

但同样的正则表达式,如果使用顺序环视功能,即(?=Jeffery),则匹配标记的位置:

by Jeffery Friend.

顺序环视会检查子表达式能否匹配,但它只寻找能够匹配的位置,而不会真正的“占用”这些字符。不过,把顺序环视和真正匹配字符的部分结合起来,我们可以得到比单纯的字符更精确的结果。和Jeff结合起来之后得到的正则表达式是(?=Jeffery)Jeff,它只能匹配“Jeffery”这个单词中的“Jeff”。它能够匹配:

by Jeffery Friend.

在此处它的匹配和单纯的Jeff一样,但是下面的情况不会匹配:

by Thomas Jefferson

Jeff自己能够匹配这一行,但是因为不存在(?=Jeffery)能够匹配的位置,整个表达式就无法匹配。

在这里插入图片描述

小例子

1.“Jeffs”替换为“Jeff’s”的几种办法比较:

在不使用环视的情况下,即s/bJeffsb/Jeff’s/g(/g表示“全局替换”,b表示单词分界符锚点),最简单直接,效率高,解决此类问题最易想到的办法,未使用环视;

也可以使用更复杂的表达式,s/b(Jeff)(s)b/$1’$2/g,但这样简单的任务似乎不值得这么麻烦;

使用顺序环视结构的正则表达式,s/bJeff(?=sb)/Jeff’/g,只有当sb在此位置能够匹配时整个表达式才能匹配成功。没有占用‘s’,除了展示顺序环视没什么价值;

如果再加上逆序环视,s/(?<=bJeff)(?=sb)/’/g,它实际上并没有匹配任何字符,只是匹配了我们希望插入’的位置。并没有占用任何文本,同时使用顺序环视和逆序环视匹配需要的位置,即’插入的位置,适于讲解环视;

也可以用s/(?=sb)(?<=bJeff) /’/g,只是上面表达式中两个环视结构颠倒,因为它并没有占用任何字符,所以变化顺序并没有影响。

2.单词分界符

如果在数值间插入逗号,会更容易看得懂。比如想要把“298444215”变成“298,444,215”,我们知道希望插入逗号的位置须满足“左边有数字,右边数字的个数正好是3的倍数”,使用(?<=d)来满足左边有数字,(?=(ddd)+$)来表示右边数字的个数正好是3的倍数($来确保这些数字后民间不存在其他字符,保证“正好”),则$text =~ s/(?<=d)(?=(ddd)+$)/,/g
匹配到需要插入逗号的位置插入:

在这里插入图片描述

3.必须包含字母、数字、特殊字符

正则表达式:^(?=.*?[a-z])(?=.*?d)(?![a-zd]+$).$,其中:

(?=.*?[a-z])限制必须有字母

(?=.*?d)限制必须有数字

(?![a-zd]+$)限制从开头到结尾不能全为数字和字母

.+在没有限定的情况下可以是任意字符

^和$ 限定字符串的开头和结尾

最后

以上就是义气西装为你收集整理的正则表达式之环视功能的全部内容,希望文章能够帮你解决正则表达式之环视功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部