精通正则表达式四:环视功能
来源:互联网 发布:pda软件开发工程师招聘 编辑:程序博客网 时间:2024/06/05 17:50
环视功能的介绍
环视有下面四种类型
(?=...) 肯定顺序环视,子表达式能匹配右侧的文本(?!...) 否定顺序环视,子表达式不能匹配右侧的文本(?<=...) 肯定逆序环视,子表达式能匹配左侧的文本(?<!...) 否定逆序环视,子表达式不能匹配左侧的文本
同样,先举例子:
这是一个肯定顺序环视,如果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)((\d\d\d)+\b)/$1,$2/g
但这样能加入所有的逗号吗?答案是否定的,因为‘(\d\d\d)+\b’已经将后面的字符都占用了,就不会再次匹配。但它也可以完成,过要加一个while循环不断匹配,直到匹配不上为止:
while($num =~ s/(\d)((\d\d\d)+\b)/$1,$2/g){}
接下来用环视来做,
my $num = 12345678;$num =~ s/(?<=\d)(?=((\d\d\d)+$))/,/g;
因为RegExr上不支持逆序环视,所以也可以这样:
my $num = 12345678;$num =~ s/(\d)(?=((\d\d\d)+$))/$1,/g;
看看匹配结果:
正是我们所需要的将‘2’和‘5’替换为‘2,’和‘5,’。
如果要将一个文件中所有的数字都加上逗号,可以在终端用一条命令完成:
perl -p -i -e 's/(?<=\d)(?=((\d\d\d)+\b))/,/g' word.txt
虽然不用环视也能完成,但效率明显要低很多!
- 精通正则表达式四:环视功能
- 《精通正则表达式》笔记 之 环视
- 正则表达式之环视
- 正则表达式环视否定例子
- vim 正则表达式之环视
- 正则表达式——环视
- 正则表达式之环视(lookaround)
- 巧解正则表达式环视
- 精通正则表达式--正则表达式入门示例拓展(2)总结笔记重点捕获型括号、环视字符
- 正则表达式实例总结-----排除环视
- 正则环视
- 正则表达式_环视(c#_正则分组构造)
- 正则表达式中零宽断言(正则环视) grep -oP参数
- 正则表达式的四种功能
- 正则表达式中环视的一个简单示例
- ruby正则表达式不支持逆序环视?该怎么解决
- 正则表达式——肯定环视模拟固化分组
- 深入理解正则表达式环视的概念与用法
- 互斥量与信号量的区别
- 【SSH框架整合】配置信息
- Java
- 行内元素的产生的元素空隙
- 面试1
- 精通正则表达式四:环视功能
- java比较器Comparator与Comparable
- cannot resolve method 'putExtra(android.os.bundle)' error
- Android SpannableString Example
- idea "Usage of API documented as @since 1.6+"的解决办法
- NSMutableDictionry保存的数据乱,和NSArray结合得出自己想要的数据
- java 面试 collection IO等基本类
- rxjava2.x
- 08_Qt的IO、内存映射