老男孩带你了解perl正则表达式中的零宽断言

栏目: Perl · 发布时间: 6年前

内容简介:老男孩带你了解perl正则表达式中的零宽断言

1.1  前言

本文只介绍 perl 语言正则表达式的零宽断言功能。

零宽断言实质:匹配文本里面的 位置。

零宽断言叫 zero-length assertions ,也叫 lookaround (这个更容易理解)。

包括:lookahead(向 前看,零宽度正预测先行断言), lookbehind (向后看,零宽度正回顾后发断言)。

从左到右对文本进行匹配,判断是否符合exp表达式。

名字

表达式

如果子表达式成功则

positive lookahead

(零宽度正预测先行断言 )

(?=subexp)

如果匹配到右边则成功

negative lookahead

(零宽度负预测先行断言 )

(?!subexp)

如果没有匹配到右边则成功

注: 成功就是找到对应的 位置

1.2  l ookahead 向前看 - 找到匹配内容前面的位置

老男孩带你了解perl正则表达式中的零宽断言

如图所示:首先这个是 lookahead (向前看)他匹配 exp 这个词( oldboy )之前的一个位置,同时是 positive lookahead 是表示匹配到 exp 就成功的意思。

注:先理解lookahead的含义。然后对比理解positive lookahead和negative lookahead的区别。

1.3  lookbehind 向后看,找到匹配内容的后面的位置

lookbehind(向后看),从右向左匹配,判断是否符合 exp 表达式。

名字

表达式

如果子表达式成功则

positive lookbehind

(零宽度正回顾后发断言 )

(?<=subexp)

如果匹配到左边则成功

negative lookbehind

(零宽度负回顾后发断言 )

(?<!subexp)

如果没有匹配到左边则成功

# 注:成功就是找到对应的 位置

老男孩带你了解perl正则表达式中的零宽断言

1.4  lookahead lookbehind 区别

老男孩带你了解perl正则表达式中的零宽断言

如图所示 lookahead 匹配的位置是在 subexp 之前, lookbehind 匹配的位置是在 subexp 之后。

1.5  perl 常用的转义字符

转义字符

含义

\b

单词的边界。

\w

表示 [a-zA-Z0-9 _ ] 中任意一个字符

\W

\w 相反表示不在 [a-zA-Z0-9 _ ] 中的任意字符

\d

[0-9]中的一个数字

\D

不在 [0-9] 中的任意字符

1.6  案例 1 :实战演示:取IP地址

  基本格式,红色就是我们的目标。

[root@node1 oldboy]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:3A:C5:88  

inet addr: 192.168.85.50   Bcast:192.168.85.255  Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe3a:c588/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:81923 errors:0 dropped:0 overruns:0 frame:0

TX packets:26480 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:96099065 (91.6 MiB)  TX bytes:3459424 (3.2 MiB)

方法一:使用positive lookahead(正常向前看,零宽度正预测先行断言)

[root@node1 oldboy]# ifconfig eth0 | grep -oP "[0-9.]+(?=  Bcast)"

192.168.85.50

[root@node1 oldboy]# ifconfig eth0 | grep -oP "[\d.]+(?=  Bcast)"

192.168.85.50  

说明:

1.这里使用 lookahead 的时候要注意, Bcast 前面有两个空格,匹配时要注意他们。

2. 前面已经说过, \d è [0-9]

方法二:使用 positive lookbehind (正常向后看,零宽度正回顾后发断言)

[root@node1 oldboy]# ifconfig eth0 | grep -oP '(?<=\baddr:)[\d.]+'

192.168.85.50

方法三:使用零宽度负预测先行断言

[root@node1 oldboy]# ifconfig eth0|grep -oP 'addr:[\d\.]+(?![\d\.])'

addr:192.168.85.50

但是去掉 "addr:" 还是需要使用lookbehind(向后看,零宽度正回顾后发断言)

[root@node1 oldboy]# ifconfig eth0|grep -oP '(?<=addr:)[\d\.]+(?![\d\.])'

192.168.85.50

方法四:使用零宽度负向回顾后发断言

[root@node1 oldboy]# ifconfig eth0|grep -oP '(?<![\d\.])[\d\.]+(?)  Bca'

192.168.85.50  Bca

但是后面的去除需要使用使用零宽度正预测先行断言

[root@node1 oldboy]# ifconfig eth0|grep -oP '(?<![\d\.])[\d\.]+(?)(?=  Bca)'

192.168.85.50  

更多精彩关注老男孩 linux培训


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

解放战争(上)(1945年8月—1948年9月)

解放战争(上)(1945年8月—1948年9月)

王树增 / 人民文学出版社 / 2009-8 / 60.00

《解放战争》为王树增非虚构文学著述中规模最大的作品。武器简陋、兵力不足的军队对抗拥有现代武器装备的兵力庞大的军队,数量不多、面积有限的解放区最终扩展成为九百六十万平方公里的共和国,解放战争在短短四年时间里演绎的是人类历史上的战争传奇。国际风云,政治智慧,时事洞察,军事谋略,军队意志,作战才能,作品具有宏阔的视角和入微的体察,包含着惊心动魄的人生沉浮和变幻莫测的战场胜负,尽展中国历史上规模最大的一场......一起来看看 《解放战争(上)(1945年8月—1948年9月)》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具