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

概述

环视功能的介绍

环视有下面四种类型

(?=...)   肯定顺序环视,子表达式能匹配右侧的文本
(?!...)   否定顺序环视,子表达式不能匹配右侧的文本
(?<=...)  肯定逆序环视,子表达式能匹配左侧的文本
(?<!...)  否定逆序环视,子表达式不能匹配左侧的文本

同样,先举例子:
这里写图片描述
这是一个肯定顺序环视,如果a的右侧是数字,那么就能匹配到a。

再来看一下否定顺序环视,其实根据上面就很好理解,如果a的右侧不是数字,那么就匹配a:
这里写图片描述
结果正如所预料的那样,但要注意的是,a的左侧没有字符也匹配了,所以‘(?!d)’与‘D’是不同的,‘D’表达的是某个数字不是字符,但前提是要有这个字符:
这里写图片描述
逆序环视和顺序环视是类似的,只不过它匹配的是左侧的文本,这里不做过多演示,而且在RegExr上也不支持逆序环视。

环视不会占用字符

通过上面的例子,我们还可以发现,环视不会占用字符,也就是说,环视它就是看一下是不是,但并不会匹配它,也就不会占用这个字符:
这里写图片描述
可以看到,肯定环视中的‘d’并没有匹配字符,而是后面的那个‘d’匹配了。

应用

先来看一个简单的例子,比如我要将Toms改为Tom’s,就可以用环视来解决:

my $name = 'Toms';
$name =~ s/(?<=Tom)(?=s)/'/g;

这样看来环视的作用并不是很大,因为不用环视也能完成这项工作并且也不复杂:

my $name = 'Toms';
$name =~ s/(Tom)(s)/$1'$2/g;

在来看一个例子,就能体会环视的作用了,它采用的就是环视不占用字符的特点,在数值间插入逗号,比如‘12345678’变为‘12,345,678’。
逗号插入的位置有这样的特点,左边是数字,右边的数字是三的倍数,如果不用环视来匹配的话,要这样

my $num = 12345678;
$num =~ s/(d)((ddd)+b)/$1,$2/g

但这样能加入所有的逗号吗?答案是否定的,因为‘(ddd)+b’已经将后面的字符都占用了,就不会再次匹配。但它也可以完成,过要加一个while循环不断匹配,直到匹配不上为止:

while($num =~ s/(d)((ddd)+b)/$1,$2/g){}

接下来用环视来做,

my $num = 12345678;
$num =~ s/(?<=d)(?=((ddd)+$))/,/g;

因为RegExr上不支持逆序环视,所以也可以这样:

my $num = 12345678;
$num =~ s/(d)(?=((ddd)+$))/$1,/g;

看看匹配结果:
这里写图片描述
正是我们所需要的将‘2’和‘5’替换为‘2,’和‘5,’。
如果要将一个文件中所有的数字都加上逗号,可以在终端用一条命令完成:

perl -p -i -e 's/(?<=d)(?=((ddd)+b))/,/g' word.txt

虽然不用环视也能完成,但效率明显要低很多!

最后

以上就是甜甜楼房为你收集整理的精通正则表达式四:环视功能的全部内容,希望文章能够帮你解决精通正则表达式四:环视功能所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部